为什么帧缓冲区纹理完全空白?

问题描述 投票:0回答:0

我有这个问题,我有 2 个帧缓冲区。我每帧画一个不同的。所以在第一帧上,它将是第一个帧缓冲区,然后是第二个,然后是第一个,依此类推。但出于某种原因,每当我尝试访问此纹理时,它都是完全空白的。我用同样的问题做了一个简化的程序。在着色器中,每个像素在第一帧获得一个随机值。然后它将其绘制到一个帧缓冲区,在那里它应该将下一个东西绘制到另一个帧缓冲区,然后返回到第一个帧缓冲区,并且它应该随着时间的推移将像素平均化为灰色。但真正发生的是第一帧是亮的,而下一帧是暗的,因为帧缓冲对象的纹理是黑色的,所以它只是颜色减半。

我尝试了几件事,首先我尝试为第一个和第二个 fbos 使用单独的变量,但这没有任何改变。然后我尝试在 for 循环中创建 fbo 变量,即 glGen 函数。然后由于某种原因,我不断收到闪烁的红色和黑色屏幕的无效操作错误,所以我恢复了一些更改,这就是我现在的位置。这是简化程序的代码。这不是真正的程序,这只是错误的再现。

创建帧缓冲区:

GLuint fbo[2], fbotex[2], rbo[2];

glGenFramebuffers(2, fbo);
glGenTextures(2, fbotex);
glGenRenderbuffers(2, rbo);

for (int i = 0; i < 2; i++)
{
    glBindFramebuffer(GL_FRAMEBUFFER, fbo[i]);

    glBindTexture(GL_TEXTURE_2D, fbotex[i]);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, SCR_WIDTH * 2, SCR_HEIGHT * 2, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glBindTexture(GL_TEXTURE_2D, 0);

    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbotex[i], 0);

    glBindRenderbuffer(GL_RENDERBUFFER, rbo[i]);
    glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, SCR_WIDTH * 2, SCR_HEIGHT * 2);
    glBindRenderbuffer(GL_RENDERBUFFER, 0);

    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo[i]);

    if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    {
        std::cout << "ERROR::FRAMEBUFFER:: Framebuffer is not complete! " << glGetError() << std::endl;
        exit(1);
    }
}

glBindFramebuffer(GL_FRAMEBUFFER, 0);

绘制随机像素:

glBindFramebuffer(GL_FRAMEBUFFER, fbo[buffer]);

glClear(GL_COLOR_BUFFER_BIT);
renderShader.use();
renderShader.setInt("width", SCR_WIDTH);
renderShader.setInt("height", SCR_HEIGHT);
renderShader.setInt("frame", frame);
renderShader.setInt("last", fbotex[1 - buffer]);

// std::cout << buffer << std::endl;;

glBindVertexArray(renderVAO);

glDrawArrays(GL_TRIANGLES, 0, 6);

glUseProgram(0);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo[buffer]);

glBlitFramebuffer(0, 0, SCR_WIDTH * 2, SCR_HEIGHT * 2, 0, 0, SCR_WIDTH * 2, SCR_HEIGHT * 2, GL_COLOR_BUFFER_BIT, GL_NEAREST);

glBindFramebuffer(GL_FRAMEBUFFER, 0);

片段着色器:

#version 330 core

out vec4 col;
in vec2 puv;

uniform sampler2D last;
uniform int width;
uniform int height;
uniform int frame;

float random(inout int seed)
{
    seed = seed * 747796405 + 289133653;
    int res = ((seed >> ((seed >> 28) + 4)) ^ seed) * 277803737;
    res = (res >> 22) ^ res;
    return res / 4294967295.0f + 0.5f;
}

void main()
{
    ivec2 pixel = ivec2(puv * vec2(width, height));

    int id = pixel.y * width + pixel.x;

    int seed = id + frame * 59082;

    vec3 oldCol = texture(last, puv).xyz;
    vec3 c = vec3(random(seed), random(seed), random(seed));

    if (frame == 0) col = vec4(c, 1);
    else col = vec4((c + oldCol) / 2, 1);
}
c++ opengl framebuffer
© www.soinside.com 2019 - 2024. All rights reserved.