我渲染到纹理,但渲染缓冲是黑色的

时间:2014-06-17 14:35:14

标签: c++ opengl-es rendering opengl-es-2.0 render

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

    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);
    }

有什么问题?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

通过执行此操作,您可以查看输出是否全部为红色?然后问题在于对象渲染,例如变换,剪切,深度拒绝或其他原因。 如果你能看到白色的物体?然后你知道这是片段着色器的问题

我还建议你删除该行 glGenerateMipmap(GL_TEXTURE_2D); 从我在代码中看到的内容来看,它不会增加额外的内容。如果不是,这是您的错误的根本原因。 在仍然使用并附加到帧缓冲对象的纹理上生成mipmap并不是非常有效,特别是如果驱动程序内部必须重新分配内存以便能够存储新的mipmap级别。

答案 1 :(得分:0)

Solved。这是索引缓冲区的问题,我忘了禁用depth_test。