0

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

4

1 回答 1

1

如果我使用格式 GL_RGBA 而不是 GL_RGB10_A2UI 一切都很好。

如果这是真的,那么这意味着您的着色器没有写入 integers

我们之前已经讨论过这个问题,但你似乎并没有真正理解一些东西。整数纹理与浮点纹理或归一化整数纹理非常不同。

在任何情况下,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. 您应该将整数写入此值,而不是浮点值。

  • 任何打算从整数纹理读取的着色器都必须使用整数采样器 uniform。并且该采样器制服必须与图像的有符号/无符号格式相匹配。所以对于你的GL_RGB10_A2UI,你必须

  • 像素传输操作必须明确使用_INTEGER像素传输格式。

于 2013-06-04T09:51:18.237 回答