【发布时间】:2014-06-16 17:13:30
【问题描述】:
我正在使用整数纹理并将其绑定到帧缓冲区以获取渲染数据。
我已将它绑定到 quad 以在屏幕上显示它,并且我确定纹理的内容是正确的。
但是当我使用 glGetTexImage 来获取纹理的内容时,我得到的是随机数。
这里是创建帧缓冲区的代码:
glEnable(GL_TEXTURE_2D);
glGenFramebuffers(1, ¶m.fbo);
glGenTextures(1,¶m.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 正确的。您不会将浮点输出写入整数纹理,存在从
uint到float的隐式转换,这可能就是为什么您可以摆脱这种情况的原因。您实际上需要写入uint输出。