Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL-深度缓冲区切掉它不应该切掉的面';在渲染半透明立方体时使用t_C++_Opengl_Transparency_Depth Buffer - Fatal编程技术网

C++ OpenGL-深度缓冲区切掉它不应该切掉的面';在渲染半透明立方体时使用t

C++ OpenGL-深度缓冲区切掉它不应该切掉的面';在渲染半透明立方体时使用t,c++,opengl,transparency,depth-buffer,C++,Opengl,Transparency,Depth Buffer,我是OpenGL的新手,遇到了这个问题:我正在尝试渲染多个半透明的立方体,这些立方体彼此内部,立方体后面的一些面刚刚被切掉。这还取决于我在多维数据集中查看的位置(参见gif) glEnable(GL_深度_测试); glDepthFunc(GL_LESS); 玻璃纹理(GL_纹理0); glBindTexture(GLU纹理2D,透明纹理); 对于(int i=0;i

我是OpenGL的新手,遇到了这个问题:我正在尝试渲染多个半透明的立方体,这些立方体彼此内部,立方体后面的一些面刚刚被切掉。这还取决于我在多维数据集中查看的位置(参见gif)

glEnable(GL_深度_测试);
glDepthFunc(GL_LESS);
玻璃纹理(GL_纹理0);
glBindTexture(GLU纹理2D,透明纹理);
对于(int i=0;i
首先,我启用深度测试并将其设置为GL_LESS。然后绑定透明纹理。之后,在for循环中,我渲染绿色矩阵,然后在循环外渲染白色矩阵。

启用

由于深度测试,几何图形被“剪切”。如果前面的面之前已经绘制过,则不会绘制后面的面,因为深度测试失败,碎片被丢弃。
禁用深度测试以使背面的面可见


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

所以每次渲染之前我都必须对它们进行排序,对吗?或者还有其他解决方法吗?@Kaaarl有一些技术,但它们并不那么容易实现。e、 好的,谢谢。我会调查一下。@Kaaarl如果只有两层,两层的alpha通道都是0.5,那么顺序就不重要了,例如
glBlendFunc(GL\u SRC\u alpha,GL\u ONE\u减去\u SRC\u alpha)
    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);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);