【发布时间】:2016-06-23 04:35:59
【问题描述】:
我创建了一个 OpenGL (GL_TEXTURE_2D) 纹理,使用 clCreateFromGLTexture() 从中创建了一个 OpenCL image2d_t 缓冲区,我运行我的 OpenCL 内核以在之前和之后使用 clEnqueueAcquireGLObjects 和 clEnqueueReleaseGLObjects 绘制到纹理,然后显示结果在OpenGL中通过这样做(我试图简单地将我的帧缓冲区纹理绘制到没有缩放的窗口,这甚至是正确的方法吗?):
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex2f(0.0f, 0.0f);
glTexCoord2f(1.0, 0.0); glVertex2f(1920.0f, 0.0f);
glTexCoord2f(1.0, 1.0); glVertex2f(1920.0f, 1080.0f);
glTexCoord2f(0.0, 1.0); glVertex2f(0.0f, 1080.0f);
glEnd();
SDL_GL_SwapWindow(window);
它工作得很好,除了有一个问题,我不知道如何用零填充纹理以使其空白,所以我看到没有写入新像素的旧像素。
显然没有办法从主机中清除 OpenCL 图像对象,所以我必须在 OpenGL 中进行(当然是在调用 clEnqueueAcquireGLObjects 之前),所以我尝试了这个:
glClearColor(0,0,0,0);
glClear(GL_COLOR_BUFFER_BIT);
然而这并没有做任何事情。当我注释掉上面的 GL_QUADS 块时,它确实在屏幕上做了一些事情,就像 glClear 不对纹理本身做任何事情,而是直接在屏幕上做任何事情。很迷惑,我对OpenGL不是很熟悉,我的贴图怎么空白?
【问题讨论】:
-
嗯,是的,
glClear清除屏幕(或者更确切地说,当前绑定的帧缓冲区对象)。它不适用于纹理。 -
@ColonelThirtyTwo;不是那种态度。提示:将纹理绑定到帧缓冲区对象,然后清除它。