【发布时间】:2020-11-10 09:13:48
【问题描述】:
我正在使用 OpenGL API (v 4.6) 来做一些图像处理的东西,它基本上是在着色器中的 OpenGL 图像加载存储操作,我通过 glBindImageTexture 加载纹理并进行一些处理,然后我想使用 glGetTexImage 来读取我更新图像的内容,但是虽然函数本身工作正常,但它返回一个全黑图像,当它加载到其他着色器中时,情况并非如此。
TLDR:图像在着色器中加载时工作正常(我在很多地方都使用它,renderdoc 在 GPU 端显示它一切正常),但它是全黑软件端。
这就是我的输出应该是using glGetTexImage(渲染后用renderdoc查看)
use_shader(&shader);
glBindBuffer (GL_ARRAY_BUFFER, quad_vbo);
setInt(shader, "screen_width", window_width);
setInt(shader, "screen_height", window_height);
glBindImageTexture(0, head_list, 0, FALSE, 0, GL_READ_WRITE, GL_R32UI); //head list is the opengl texture id
glDrawArrays(GL_TRIANGLES, 0, 24);
glBindVertexArray(0);
glMemoryBarrier(GL_ALL_BARRIER_BITS);
//the image is just a GL_RED so one component
GLint *image_head= (GLint*)malloc(sizeof(u32) *window_width *window_height);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, head_list);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED, GL_UNSIGNED_INT, image_head);
【问题讨论】:
-
我不确定我在说什么,但可能是您请求时图像尚未准备好。尝试在读取图像之前添加
glFinish(),这是一种快速而肮脏的方式来告诉 OpenGL 阻塞直到所有操作完成。 -
这似乎不是同步问题,因为我有 glMemoryBarrier(GL_ALL_BARRIER_BITS) 一切只是为了确定。不过不错的技巧。
-
啊,好吧。也许你能告诉我们一些你的代码吗?
-
我已经用代码更新了问题,非常感谢。
-
谢谢,你怎么知道image_head是全黑的?您将图像读取为
GL_FLOAT并且指针的类型为GLint,这有点奇怪,但这应该不是问题
标签: image-processing opengl glsl opengl-4