我正在使用FBO并渲染到纹理。这是我的代码:
GLuint FramebufferName = 0;
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
GLuint renderedTexture;
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB10_A2UI,256,256,0,GL_RGBA_INTEGER,GL_UNSIGNED_INT_10_10_10_2,0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
GLuint color_buffer;
glGenRenderbuffers(1, &color_buffer);
glBindRenderbuffer(GL_RENDERBUFFER, color_buffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_RGB10_A2UI, 256, 256);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, color_buffer);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,renderedTexture, 0);
GLenum DrawBuffers[2] = {GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);
GLuint textureId;
LoadImage(textureId); // Loads texture data into textureId
Render(); // Renders textureId onto FramebufferName
glBindFramebuffer(GL_FRAMEBUFFER, 0); // Bind default FBO
glBindTexture(GL_TEXTURE_2D, renderedTexture); //Render using renderedTexture
glDrawArrays (GL_TRIANGLE_FAN,0, 4);
输出不正确。图像未正确呈现。如果我使用格式GL_RGBA而不是GL_RGB10_A2UI一切都很好。 FBO是GL_FRAMEBUFFER_COMPLETE,没有问题。我在这里做错了吗?
GL_RGB10_A2UI的片段着色器是:
in vec2 texcoord;
uniform usampler2D basetexture;
out vec4 Color;
void main(void)
{
uvec4 IntColor = texture(basetexture, texcoord);
Color = vec4(IntColor.rgb, 1023.0) / 1023.0;
}
对于GL_RGBA,我没有在着色器中进行规范化。
答案 0 :(得分:1)
如果我使用格式GL_RGBA而不是GL_RGB10_A2UI,一切都会顺利。
如果这是真的,那么这意味着你的着色器没有写整数。
我们之前已经讨论过这个问题,但你似乎并不理解某些事情。整数纹理与浮点纹理或规范化整数纹理的非常不同。
没有GL_RGBA8
纹理和 GL_RGB10_A2UI
纹理都可以使用相同代码的情况。相同的着色器无法从可以归一化或整体纹理的纹理中读取。同一个着色器不能写入一个可以规范化或整数的缓冲区。相同的像素传输代码不能写入或读取可以归一化或积分的图像。它们在各方面都是不同的实体,需要不同的参数来访问它们。
此外,即使着色器可以写入任何一个,它会写什么?整数纹理采用整数;如果你试图将范围[0,1]上的浮点值固定为一个整数,它将会出现为0或1.如果你试图在[0,1]范围内放一个整数,你如果整数为零,则为0,否则为1。所以无论你的片段着色器做什么都很困惑。
尽管您认为自己真的有意使用GL_RGB10_A2
,但您真正应该使用GL_RGB10_A2UI
的赔率非常高。如果你真的打算写整数,你的着色器会写整数而不是浮点数,因此你的着色器不会与GL_RGBA8
“一起工作”。
但是,如果你真的,真正想要使用无符号积分纹理,你真的,真正明白这意味着什么以及如何它与GL_RGB10_A2
不同,那么您需要做的就是:
任何打算写入整数纹理的片段着色器都必须写入整数输出变量。并且该输出的签名/未签名状态必须与目标映像的签名/未签名格式匹配。因此,对于GL_RGB10_A2UI
,无符号整数格式,您必须写入uvec4
。您应该将整数写入此值,而不是浮点值。
任何打算从整数纹理中读取的着色器都必须使用integer sampler uniform。并且该采样器制服必须与图像的有符号/无符号格式匹配。因此,对于GL_RGB10_A2UI
,您必须
像素传输操作必须明确使用_INTEGER
像素传输格式。