我正在渲染纹理,但渲染缓冲区是黑色的

I'm rendering to texture,but renderbuffer is black

本文关键字:缓冲区 黑色 纹理      更新时间:2023-10-16

我正在尝试渲染纹理。使用opengl-es 2.0。我想做黑白后期处理。但我只看到黑色的纹理。在场景中,我有光源和两个球体。但是当我试图渲染附加到framebuffer的纹理时,我看到黑色方块。

    this->frameBuffersCount = 3;
    this->frameBuffers = new int[frameBuffersCount];
    glGenFramebuffers(frameBuffersCount, (GLuint*)this->frameBuffers);
    this->texturesCount = this->frameBuffersCount * 2;
    this->bufferTextures = new int[this->texturesCount];
    glGenTextures(this->texturesCount, (GLuint*)this->bufferTextures);
    for(int i = 0; i < this->texturesCount / 2; ++i)
    {
        glBindTexture(GL_TEXTURE_2D, this->bufferTextures[2*i]);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, screenWidth, screenHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
        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_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glBindTexture(GL_TEXTURE_2D,0);
        glBindTexture(GL_TEXTURE_2D, this->bufferTextures[2*i + 1]);
        glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT, screenWidth, screenHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, 0);
        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_MAG_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glBindTexture(GL_TEXTURE_2D,0);
    }
    for(int i = 0; i < this->frameBuffersCount; ++i)
    {
        glBindFramebuffer(GL_FRAMEBUFFER, this->frameBuffers[i]);
        glFramebufferTexture2D(GL_FRAMEBUFFER,
            GL_COLOR_ATTACHMENT0,
            GL_TEXTURE_2D,
            this->bufferTextures[2*i],
            0);
        glFramebufferTexture2D(GL_FRAMEBUFFER,
            GL_DEPTH_ATTACHMENT,
            GL_TEXTURE_2D,
            this->bufferTextures[2*i + 1],
            0);
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
    }
    this->ordinaryQuad = new ModelVertex[4];
    this->ordinaryQuad[0].UV = Vector2(0.0,0.0);
    this->ordinaryQuad[0].position = Vector3(-1, -1, 0.0);
    this->ordinaryQuad[1].UV = Vector2(0.0,1.0);
    this->ordinaryQuad[1].position = Vector3(-1.0, 1.0, 0.0);
    this->ordinaryQuad[2].UV = Vector2(1.0,1.0);
    this->ordinaryQuad[2].position = Vector3(1.0, 1.0, 0.0);
    this->ordinaryQuad[3].UV = Vector2(1.0,0.0);
    this->ordinaryQuad[3].position = Vector3(1.0, -1.0, 0.0);

这是渲染代码。

    void EffectManager::applyBnW()
{
    glBindFramebuffer(GL_FRAMEBUFFER, this->frameBuffers[0]);
    auto res = glCheckFramebufferStatus(GL_FRAMEBUFFER);
    if(res == GL_FRAMEBUFFER_COMPLETE)
    {
        SceneManager::GetInstance().DrawScene();
        glDisable(GL_DEPTH_TEST);
        unsigned short indices[6] = {0,2,1,2,0,3};
        Shaders shaders;
        shaders.Init("../Resources/Shaders/BlackAndWhiteVS.vs", "../Resources/Shaders/BlackAndWhiteFS.fs", 0);
        glUseProgram(shaders.program);
        unsigned int hVBuff,hInBuff;
        glGenBuffers(1, &hVBuff);
        glGenBuffers(1, &hInBuff);
        glBindBuffer(GL_ARRAY_BUFFER, hVBuff);
        glBufferData(GL_ARRAY_BUFFER, 4 * sizeof(SEngine::ModelVertex), this->ordinaryQuad, GL_STATIC_DRAW);
        //glBindBuffer(GL_ARRAY_BUFFER, 0);
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, hInBuff);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned short), indices, GL_STATIC_DRAW);
        //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, this->bufferTextures[0]);
        glGenerateMipmap(GL_TEXTURE_2D);
        if(shaders.positionAttribute != -1)
        {
            glEnableVertexAttribArray(shaders.positionAttribute);
            glVertexAttribPointer(shaders.positionAttribute, 3, GL_FLOAT, GL_FALSE, sizeof(SEngine::ModelVertex), 0);
        }
        if(shaders.UVAttribute != -1)
        {
            glEnableVertexAttribArray(shaders.UVAttribute);
            glVertexAttribPointer(shaders.UVAttribute, 2, GL_FLOAT, GL_FALSE, sizeof(SEngine::ModelVertex), (void*)(sizeof(Vector3)));
        }
        if(shaders.samplerUniform != -1)
        {
            glUniform1i(shaders.samplerUniform, 0);
        }
        glBindFramebuffer(GL_FRAMEBUFFER, 0);
        glDrawElements(GL_TRIANGLES, 6,  GL_UNSIGNED_SHORT, (void*)0);
        //glDrawArrays(GL_TRIANGLES,0,4);
    }

怎么了?

由于您的问题中没有提供足够的信息/代码,因此无法给出明确的答案。

是否清除了深度缓冲区?当你在碎片着色器中为渲染对象生成颜色时,你是否正确地计算了白色?

在这种情况下,帮助我调试问题的一种方法是删除潜在的错误区域。

清除framebuffer为红色和Alpha通道= 1.0清除深度缓冲硬编码gl_FragColor到vec4(1,1,1,1)

通过这样做,您可以看到输出是否全是红色?然后是对象渲染的问题,比如变换、裁剪、深度拒绝或其他原因。如果你能看到白色的物体?然后你知道这是你的片段着色器的问题

我也建议你去掉这一行glGenerateMipmap (GL_TEXTURE_2D);从我在你的代码中可以看到,它没有添加任何额外的。如果不是,这就是错误的根本原因。在纹理上生成仍在使用并附加到framebuffer对象的mipmap并不是非常有效,特别是如果驱动程序内部必须重新分配内存以能够存储新的mipmap级别。

解决。这是索引缓冲区的问题,我忘记禁用depth_test.