【问题标题】:I'm rendering to texture,but renderbuffer is black我正在渲染纹理,但渲染缓冲区是黑色的
【发布时间】:2014-08-07 15:06:47
【问题描述】:

我正在尝试渲染到纹理。使用 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);
    }

怎么了?

【问题讨论】:

  • 代码太多,做个SSCCE吧。
  • 什么是SSCCE?我不明白。
  • 谷歌会帮你理解的。
  • 是Short, Self Contained, Correct (Compilable)的缩写,例如sscce.org
  • 我不能让它更短,因为我认为这个错误是在这个文本中。

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


【解决方案1】:

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

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

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

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

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

我还建议您删除该行 glGenerateMipmap(GL_TEXTURE_2D); 正如我在您的代码中看到的那样,它没有添加任何额外内容。如果不是,这是您错误的根本原因。 在仍在使用并附加到帧缓冲区对象的纹理上生成 mipmap 效率不是很高,尤其是在内部驱动程序必须重新分配内存才能存储新的 mipmap 级别时。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      相关资源
      最近更新 更多