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

Posted

技术标签:

【中文标题】GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO【英文标题】:GLSL: unable to read texture from a FBO and render to another FBO with fragment shader 【发布时间】:2012-02-10 15:48:08 【问题描述】:

我正在尝试“读取”附加到第一个 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 中纹理的精确副本。

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

【问题讨论】:

【参考方案1】:
uniform sampler2D texture;

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

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

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

【讨论】:

我将所有的 GL_TEXTURE_RECTANGLE_ARG 更改为 GL_TEXTURE_2D 但使用 sampler2DRect 对我来说更容易。非常感谢!【参考方案2】:

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

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

【讨论】:

非常感谢您的帮助。最后,我将 sampler2D 更改为 sampler2DRect 因为这对我来说更容易,但还是谢谢你!

以上是关于GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO的主要内容,如果未能解决你的问题,请参考以下文章

FBO 的延迟着色器纹理显示为黑色

OpenGL 片段着色器未写入 fbo 颜色缓冲区

GLSL将颜色数据从片段着色器发送到顶点着色器似乎总是等于0

在GLSL ES中的片段着色器上旋转纹理

使用 FBO 和着色器 OpenGL 渲染到纹理

帧缓冲纹理出现白色(片段着色器不影响它)