【问题标题】:OpenGL - depth buffer cuts out faces it shouldn't while rendering semi-transparent cubes [duplicate]OpenGL - 深度缓冲区在渲染半透明立方体时会切掉不应出现的面[重复]
【发布时间】:2019-06-25 12:54:31
【问题描述】:

我对 OpenGL 还很陌生,遇到了这个问题:我正在尝试渲染多个彼此内部的半透明立方体,而立方体背面的一些面刚刚被切掉。它还取决于我在立方体内部的位置(参见 gif)。

https://i.imgur.com/bL4U8BS.gifv

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, transparentTexture);

    for (int i = 0; i < CacheSizeInfo.size(); ++i)
        {
            int totalCacheSize = CacheSizeInfo[i][0]* CacheSizeInfo[i][1]* CacheSizeInfo[i][2];
            std::vector<float> Cachecolor = { CacheColorInfo[i][0], CacheColorInfo[i][1], CacheColorInfo[i][2]};
            int cacheOffset = (renderIndex / totalCacheSize) * totalCacheSize;

            mat4 translationMatrix = glm::translate(mat4(1.0f), modelMatrices[cacheOffset]);
            glUniformMatrix4fv(glGetUniformLocation(shaderID, "translation"), 1, GL_FALSE, &translationMatrix[0][0]);
            glUniform3fv(glGetUniformLocation(shaderID, "color"), 1, &Cachecolor[0]);

            glBindVertexArray(CacheVAOInfo[i]);
            glDrawArrays(GL_TRIANGLES, 0, CacheVertexCountInfo[i]);
            glBindVertexArray(0);
        }
    }

    mat4 translationMatrix = glm::mat4(1.0f);
    glUniformMatrix4fv(glGetUniformLocation(shaderID, "translation"), 1, GL_FALSE, &translationMatrix[0][0]);
    glUniform3fv(glGetUniformLocation(shaderID, "color"), 1, &matColor[0]);

    glBindVertexArray(VAO_Matrix);
    glDrawArrays(GL_TRIANGLES,0, mainMatSize*3);
    glBindVertexArray(0);

首先我启用深度测试并将其设置为 GL_LESS。然后我绑定透明纹理。之后,在 for 循环中,我渲染绿色矩阵,然后,在循环之外,白色矩阵。

【问题讨论】:

    标签: c++ opengl transparency depth-buffer


    【解决方案1】:

    Depth Test 已启用

    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LESS);
    

    由于深度测试,几何体被“切掉”。后面的面不画,前面的面已经画过,因为深度测试失败,碎片被丢弃。
    禁用深度测试以使后面的人脸可见。

    但请注意,Blending 取决于绘图顺序。您必须从后到前渲染几何图形,因此深度测试 (GL_LESS) 变得多余。

    【讨论】:

    • 所以我必须在每次渲染它们之前对它们进行排序,对吧?还是有其他解决方法?
    • @Kaaarl 有Order-independent transparency 技术,但实施起来并不容易。例如Adaptive Transparency
    • 好的,谢谢。我会调查的。
    • @Kaaarl 它只有 2 层,两层的 alpha 通道都是 0.5,那么顺序无关紧要,例如glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多