想要画出透明物体就要先将后面的不透明物体按正常z-buffer算法画好,然后再将透明的物体叠合(而不是替换)到现有z-buffer上,要实现这个要求,就需要调用glDepthMask(GL_FALSE);函数,将深度缓冲区设置为只读形式。
具体在我的程序中的用法如下:
vector<HEFace*> TransparentFaces;
for (vector<HEFace*>::size_type nIndex = 0; nIndex < m_Faces.size(); ++ nIndex)
{
if (m_Faces[nIndex] != NULL && m_Faces[nIndex]->m_mtl != NULL)
{
if (m_Faces[nIndex]->m_mtl->IsTransparent() == false)
m_Faces[nIndex]->Draw();
else
TransparentFaces.push_back(m_Faces[nIndex]);
}
else
m_Faces[nIndex]->Draw();
}
// Draw Transparent Objects
glDepthMask(GL_FALSE);
for (vector<HEFace*>::size_type nIndex = 0; nIndex < TransparentFaces.size(); ++ nIndex)
TransparentFaces[nIndex]->Draw();
glDepthMask(GL_TRUE);
这样分离出透明和不透明的两种物体分别使用不同的深度缓存读取策略进行绘制,能得到较好的视觉效果。