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

标签 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 中纹理的精确副本。

为什么会发生这种情况?我错过了什么吗?

最佳答案

uniform sampler2D texture;

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

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

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

关于opengl - GLSL:无法从 FBO 读取纹理并使用片段着色器渲染到另一个 FBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9230506/

相关文章:

c++ - 在 directx 应用程序中,找到已知位置的 z(地形)

java - 带有 OpenGL JOGL Java 的方形边界框

c++ - 如何应用位置变换

colors - WebGL 中的混合如何与 GLSL ES 片段着色器一起工作?

ios - 创建一个高效的纹理重新着色片段着色器

javascript - 三.JS | GLSL 通过场景纹理设置粒子颜色

c++ - 连续内存、OpenGL,以及如何包装顶点?

opengl - 有人可以描述 Ken Silverman 的 Voxlap 引擎使用的算法吗?

java - 纹理渲染为黑色四边形

opengl - ffmpeg 到 opengl 纹理与 glTexImage2D