c++ - OpenGL - 深度缓冲区在渲染半透明立方体时切出不应该的面

标签 c++ opengl transparency depth-buffer

<分区>

我是 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。然后我绑定(bind)透明纹理。之后,在 for 循环中,我渲染绿色矩阵,然后在循环外渲染白色矩阵。

最佳答案

Depth Test已启用

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

由于深度测试,几何形状被“剪掉”。后面的人脸没有画出来,因为前面的人脸已经画过了,因为深度测试失败,碎片被丢弃。
禁用深度测试以使后面的脸可见。

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

关于c++ - OpenGL - 深度缓冲区在渲染半透明立方体时切出不应该的面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56754586/

相关文章:

c++ - OpenGL:无法使用 freeGLUT 执行渲染? C++

c++ - 堆摘要错误中不匹配

c++ - 如何在 C++ 中针对克隆习惯创建 spy 类

opengl - glVertexAttribDivisor 会影响非实例化的 glDrawArrays 调用吗?

Python - 找不到记录器 "OpenGL.error"的处理程序

android - 在 Android 平台上操作谷歌地图中的投影

css - 无法将 Photoshop 不透明度转换为 CSS3

html - 文本显示在弹出菜单顶部

c++ - 提升asio async_read : the read message adds to itself

c# - C# 是否像 Objective-C 和 C++ 一样是 C 的超集?