【问题标题】:How to blank my OpenGL texture如何清空我的 OpenGL 纹理
【发布时间】: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;不是那种态度。提示:将纹理绑定到帧缓冲区对象,然后清除它。

标签: opengl opencl


【解决方案1】:

OpenGL glClear 清除当前绑定的帧缓冲区。要对纹理进行此操作,请创建一个帧缓冲区对象,将纹理附加到它,绑定帧缓冲区对象以进行绘图操作并清除它(然后将清除纹理)。

【讨论】:

  • 我在这样做时遇到了麻烦,结果证明uint32_t z = 0; glClearTexImage(texture_id, 0, GL_RGBA, GL_UNSIGNED_BYTE, &z); 也可以!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2012-06-02
  • 2011-05-19
  • 1970-01-01
相关资源
最近更新 更多