在glRenderBufferStorage()中使用RGB10_A2_UI格式

时间:2013-06-04 06:52:27

标签: opengl opengl-3 fbo

我正在使用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,我没有在着色器中进行规范化。

1 个答案:

答案 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像素传输格式。