OpenGL中三位物体的透明实现

本文介绍了一种在3D场景中高效绘制透明与不透明物体的方法,通过使用glDepthMask(GL_FALSE)函数调整深度缓冲区读取策略,实现了更好的视觉效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想要画出透明物体就要先将后面的不透明物体按正常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);

 

这样分离出透明和不透明的两种物体分别使用不同的深度缓存读取策略进行绘制,能得到较好的视觉效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值