GLSL:无法从FBO读取纹理并使用片段着色器渲染到另一个FBO

时间:2012-02-10 15:48:09

标签: opengl glsl textures fragment-shader fbo

我试图"读"附加到第一个FBO(fboA)的纹理,修改它(使用片段着色器)并渲染到第二个FBO(fboB)。

我无法弄清楚,我得到的只是黑色或白色纹理。

以下是代码:

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboB);
glEnable(GL_TEXTURE_RECTANGLE_ARB);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, textureFromFboA);

GLuint t1Location = glGetUniformLocation(shaderProgram, "texture");
glUniform1i(t1Location, 0);

glUseProgram(shaderProgram);

glBegin(GL_QUADS);

glTexCoord2f(0.0f, 0.0f);
glVertex2f (0.0f, 0.0f);

glTexCoord2f(imageRect.size.width, 0.0f); 
glVertex2f (imageRect.size.width, 0.0f);

glTexCoord2f(imageRect.size.width, imageRect.size.height);
glVertex2f (imageRect.size.width, imageRect.size.height);

glTexCoord2f(0.0f, imageRect.size.height);
glVertex2f (0.0f,imageRect.size.height);

glEnd();
glDisable(GL_TEXTURE_RECTANGLE_ARB);
glFlush();

glUseProgram(0);

这是片段着色器代码:

#version 120

uniform sampler2D texture;

void main(void)
{
    gl_FragColor = texture2D(texture, gl_TexCoord[0].st) * 0.8;
}

我希望在fboB中渲染一个更暗的纹理,但我只得到一个全黑的纹理。如果我写gl_FragColor = texture2D(texture, gl_TexCoord[0].st);,也会发生这种情况。

相反,如果我写gl_FragColor = vec2(1.0, 0.0, 0.0, 1.0);我正确地将全红色纹理作为输出。

如果我注释掉glUseProgram()语句,代码工作正常,fboB中的纹理是fboA中纹理的精确副本。

为什么会这样?我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

您不能将sampler2D用于纹理矩形...您必须使用GL_TEXTURE_2D而不是GL_TEXTURE_RECTANGLE_ARB。

在这里你有一个关于FBO的很好的教程: http://www.songho.ca/opengl/gl_fbo.html

答案 1 :(得分:2)

uniform sampler2D texture;

Rectangle textures与2D纹理不同texture type。是的,它们是二维的,但它们仍然保持着独特的纹理类型。因此,无法通过sampler2D访问它们。

所以将其更改为samplerRect。您还需要使用正确的纹理坐标,因为矩形纹理采用纹理空间坐标而不是标准化坐标。

或者,您可以使用2D纹理。 NPOT纹理已存在超过五年;您不必使用矩形纹理来获得非二次幂渲染目标。