首页 > 解决方案 > glGetTexImage 返回全黑纹理

问题描述

我正在使用 OpenGL API (v 4.6) 来做一些图像处理的东西,它基本上是在着色器中的 OpenGL 图像加载存储操作,我通过 glBindImageTexture 加载纹理并进行一些处理,然后我想使用 glGetTexImage 来读取内容我更新的图像,但虽然函数本身工作正常,但它返回全黑图像,当它加载到其他着色器中时,情况并非如此。

TLDR:图像在着色器中加载时工作正常(我在许多地方使用它,renderdoc 在 GPU 端显示它一切正常),但它是全黑的软件端。

这就是我使用 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);

标签: image-processingopenglglslopengl-4

解决方案


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


推荐阅读