【问题标题】:glGetTexImage don't work with unsigned integer textureglGetTexImage 不适用于无符号整数纹理
【发布时间】:2014-06-16 17:13:30
【问题描述】:

我正在使用整数纹理并将其绑定到帧缓冲区以获取渲染数据。

我已将它绑定到 quad 以在屏幕上显示它,并且我确定纹理的内容是正确的。

但是当我使用 glGetTexImage 来获取纹理的内容时,我得到的是随机数。

这里是创建帧缓冲区的代码:

glEnable(GL_TEXTURE_2D); 
glGenFramebuffers(1, &param.fbo);
glGenTextures(1,&param.triTex);
glBindTexture(GL_TEXTURE_2D, param.triTex); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_FALSE); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_R32UI, param.fboSize, param.fboSize, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, 0);
glBindFramebuffer(GL_FRAMEBUFFER, param.fbo); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, param.triTex, 0);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, 0);

纹理和帧缓冲区渲染没有问题。

获取内容的代码如下:

glBindTexture(GL_TEXTURE_2D, param.triTex);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
triTexData = (unsigned int *)malloc(param.fboSize * param.fboSize * sizeof(unsigned int));
memset(triTexData, 0, sizeof(unsigned int) * param.fboSize * param.fboSize);
glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, triTexData);
glBindTexture(GL_TEXTURE_2D,0);

片段着色器和几何着色器

#version 330
flat in int color;
out vec4 fragColor;
void main(void)     
{
    fragColor = vec4(color,0.0,0.0,0.0);
}

#version 330
layout (triangles) in;
layout (triangle_strip, max_vertices = 3) out;
flat out int color;
void main(void)
{
gl_Position = gl_in[0].gl_Position;
color = gl_PrimitiveIDIn;
EmitVertex();
gl_Position = gl_in[1].gl_Position;
color = gl_PrimitiveIDIn;
EmitVertex();
gl_Position = gl_in[2].gl_Position;
color = gl_PrimitiveIDIn;
EmitVertex();
EndPrimitive();
};

【问题讨论】:

  • 为什么不使用calloc (...) 而不是在分配之后清零内存?不过,对于真正重要的事情,您能否将您正在使用的片段着色器添加到 output 到无符号整数纹理附件中?
  • @AndonM.Coleman 在我的片段着色器中,我将信息作为浮点数输出到红色通道,我可以保证输出正确,因为我将它绑定到四边形并在屏幕上显示
  • @AndonM.Coleman 我已经粘贴了我的片段着色器和几何着色器。检查更新:-)
  • 我可以向你保证,如果你输出为浮点数,那么输出是 not 正确的。您不会将浮点输出写入整数纹理,存在从 uintfloat 的隐式转换,这可能就是为什么您可以摆脱这种情况的原因。您实际上需要写入uint 输出。

标签: opengl textures


【解决方案1】:

您的片段着色器实际上应该这样编写以输出到GL_R32UI 图像:

#version 330

flat in  int  color;
     out uint fragColor;

void main (void) {
  fragColor = color;
}

目前,您没有读回 “随机” 数字,您只是看到在没有正确转换的情况下将浮点数据解释为整数时会发生什么。 不愉快,是吗?

【讨论】:

  • 我不认为这可能是片段着色器的问题...非常感谢。 :-)
猜你喜欢
  • 2021-03-19
  • 2012-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多