首页 > 解决方案 > OpenGL - 深度缓冲区在渲染半透明立方体时会切掉不应出现的面

问题描述

我对 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++opengltransparencydepth-buffer

解决方案


深度测试已启用

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

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

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


推荐阅读