【问题标题】:glGetTexImage returns all-black texture [closed]glGetTexImage 返回全黑纹理
【发布时间】: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


【解决方案1】:

找到了。 GL_RED 仅适用于浮点组件,通过更改所有代码,即 glTexImage 和 glGetTexImage GL_REDs 到 GL_RED_INTEGERs 问题得到解决!

【讨论】:

猜你喜欢
  • 2017-06-28
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多