【发布时间】:2012-02-08 02:29:40
【问题描述】:
我打算使用 OpenCL 进行图形计算,例如光线投射、光线行进等。我想使用 OpenGL 来显示这个计算的结果(像素图像)。我使用附加到帧缓冲区的纹理缓冲区。 OpenCL 将结果写入纹理,然后我使用 glBlitFrameBuffer 函数将纹理数据复制到应用程序窗口帧缓冲区。 我在执行过程中遇到了一个 CL/GL 间问题。我写了一个简单的例子来展示它。这个例子展示了帧缓冲区对象和纹理对象的初始化,它们的结合,从 GL 纹理缓冲区创建 OpenCL 缓冲区。最后显示了主渲染循环。它包括在每一帧中使用新数据写入纹理、附加帧缓冲区以及复制该帧缓冲区。
纹理初始化:
for (int i = 0; i < data.Length; i +=4) {
data [i] = 255;
}
GL.BindTexture (TextureTarget.Texture2D, tboID [0]);
GL.TexImage2D<byte>(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, w, h, 0,
PixelFormat.Rgba, PixelType.UnsignedByte, data);
GL.BindTexture (TextureTarget.Texture2D, 0)
TBO+FBO 初始化:
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, fboID [0]);
GL.FramebufferTexture2D (FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0,
TextureTarget.Texture2D, tboID [0], 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, 0);
CL/GL 初始化:
bufferID = CL.CreateFromGLTexture2D (context, memInfo, textureTarget, mipLevel, glBufferObject, out errorCode);
渲染循环:
for (int i = 0; i < data.Length; i += 4) {
data [i] = tt;
}
tt++;
GL.BindTexture (TextureTarget.Texture2D, tboID [0]);
GL.TexImage2D<byte> (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, w, h, 0,
PixelFormat.Rgba, PixelType.UnsignedByte, data);
GL.BindTexture (TextureTarget.Texture2D, 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, fboID [0]);
GL.FramebufferTexture2D (FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0,
TextureTarget.Texture2D, tboID [0], 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, 0);GL.BindFramebuffer (FramebufferTarget.ReadFramebuffer, fboID [0]);
GL.ReadBuffer (ReadBufferMode.ColorAttachment0);
GL.DrawBuffer (DrawBufferMode.Back);
GL.BlitFramebuffer (0, 0, w, h, 0, 0, w, h, ClearBufferMask.ColorBufferBit, BlitFramebufferFilter.Nearest);
GL.BindFramebuffer (FramebufferTarget.ReadFramebuffer, 0);
乍一看,这段代码看起来很奇怪,但它完全说明了我的问题。 CL 在这里根本不起作用。在此应用程序中,创建了 OpenCL 上下文并进行了 OpenCL 缓冲区初始化。 这个工作应该很简单。屏幕颜色正在从黑色变为红色。它不能以这种方式工作。颜色不会从最初的红色改变(纹理初始化)。 但是当我评论 CL/GL 初始化(从 GL 纹理创建 CL 缓冲区)时它工作正常。 为什么会这样?为什么 GL 缓冲区的行为会根据 CL 附件而改变?如何修复它并使其正常工作?
【问题讨论】:
-
我最终可以确认这种行为,只要有一个 Image2DGL 对象绑定到纹理,纹理就会被阻止并且无法写入或从另一个上下文写入。这也在英伟达设备上。问题来了,为什么有明确的
acquire和release如果无论如何都被阻止了。