使用Framebuffer Object作为纹理的视觉问题

时间:2015-03-22 13:20:20

标签: c++ opengl glsl fbo render-to-texture

我的OpenGL引擎将给定场景绘制到Framebuffer对象中,然后将其颜色附件用作纹理。然后将它放在视口中的正方形上。

问题是我看到一个奇怪的视觉神器:

enter image description here

广场是用

构建的
glm::vec2 square[4];
square[0] = glm::vec2(0.f, 0.f);
square[1] = glm::vec2(engWidth, 0.f);
square[2] = glm::vec2(0.f, engHeight);
square[3] = glm::vec2(engWidth, engHeight);
glm::vec2 texcoords[4];
texcoords[0] = glm::vec2(0.f, 0.f);
texcoords[1] = glm::vec2(1.f, 0.f);
texcoords[2] = glm::vec2(0.f, 1.f);
texcoords[3] = glm::vec2(1.f, 1.f);

glGenBuffers(2, Buffer2D);
glBindBuffer(GL_ARRAY_BUFFER, Buffer2D[0]);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(glm::vec2), square, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, Buffer2D[1]);
glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(glm::vec2), texcoords, GL_STATIC_DRAW);

orthographicProj = glm::ortho(0.f, (float)engWidth, 0.f, (float)engHeight, -1.f, 1.f);

其中engWidth和engHeight是实际窗口大小。

然后使用

渲染帧
shaderProgram->setMatrix("Clip", orthographicProj);

glBindBuffer(GL_ARRAY_BUFFER, Buffer2D[0]);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ARRAY_BUFFER, Buffer2D[1]);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 0, nullptr);
glEnableVertexAttribArray(1);

glDisableVertexAttribArray(2);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

最后阶段的顶点和片段着色器很简单

const char *frontVertexShader = R"(
    #version 440 core

    uniform mat4 Clip;

    layout(location = 0) in vec2 Position;
    layout(location = 1) in vec2 TexCoord;

    out vec2 Tex_Coord;

    void main() {
        gl_Position = Clip * vec4(Position, 0.0, 1.0);
        Tex_Coord = TexCoord;
    }
)";

const char *frontFragmentShader = R"(
    #version 440 core

    in vec2 Tex_Coord;  
    uniform sampler2D sampler;

    out vec4 Fragment;

    void main() {
        Fragment = texture(sampler, Tex_Coord);
    }
)";

我尝试使用三角形代替三角形条带,但结果相同。

有什么想法吗?如果需要,我可以发布更多代码。

2 个答案:

答案 0 :(得分:2)

我不知道这是否会有所帮助,但对于它的价值而言,这就是我为全屏四边形做的事情:

(注意顶点没有纹理组件 - 它只是-1到1)。

v[0].x = -1.f; v[0].y = -1.f; v[0].z = 0.f;
v[1].x = -1.f; v[1].y =  1.f; v[1].z = 0.f;
v[2].x =  1.f; v[2].y = -1.f; v[2].z = 0.f;
v[3].x =  1.f; v[3].y =  1.f; v[3].z = 0.f;

顶点着色器只是:

void main()
{
    attrib_Fragment_Texture = attrib_Position.xy * 0.5 + 0.5; 

    gl_Position = vec4(attrib_Position.xy, 0.0, 1.0);
}

使用以下像素着色器:

void main(void)
{
    Out_Colour = texture2D(Map_Diffuse, attrib_Fragment_Texture);
}

您不需要正投影矩阵。

答案 1 :(得分:2)

发现它!我忘了在后备缓冲器上调用glClear,并且由于一个奇怪的原因,只有一些像素出现了这个问题。