C++ OpenGL-深度缓冲区切掉它不应该切掉的面';在渲染半透明立方体时使用t
我是OpenGL的新手,遇到了这个问题:我正在尝试渲染多个半透明的立方体,这些立方体彼此内部,立方体后面的一些面刚刚被切掉。这还取决于我在多维数据集中查看的位置(参见gif)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
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);