OpenGL中三位物体的透明实现

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

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的OpenGL程序,可以实现物体的三视图: ```c++ #include <GL/glut.h> void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 正视图 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1, 1, -1, 1, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0); glColor3f(1, 0, 0); glBegin(GL_TRIANGLES); glVertex3f(-0.5, -0.5, 0); glVertex3f(0.5, -0.5, 0); glVertex3f(0, 0.5, 0); glEnd(); // 侧视图 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1, 1, -1, 1, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 0, 1, 0, 0, 0, 0, 1, 0); glRotatef(90, 0, 1, 0); glColor3f(0, 1, 0); glBegin(GL_TRIANGLES); glVertex3f(-0.5, -0.5, 0); glVertex3f(0.5, -0.5, 0); glVertex3f(0, 0.5, 0); glEnd(); // 俯视图 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-1, 1, -1, 1, -1, 1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(0, 1, 0, 0, 0, 0, 0, 0, 1); glColor3f(0, 0, 1); glBegin(GL_TRIANGLES); glVertex3f(-0.5, -0.5, 0); glVertex3f(0.5, -0.5, 0); glVertex3f(0, 0.5, 0); glEnd(); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize(800, 600); glutCreateWindow("Three Views"); glEnable(GL_DEPTH_TEST); glutDisplayFunc(display); glutMainLoop(); return 0; } ``` 在这个程序,我们使用了三个不同的视图矩阵来实现物体的三视图。在每个视图,我们都绘制了一个简单的三角形来代表物体。为了使三个视图不重叠,我们在每个视图都使用了不同的颜色。最后,我们使用了OpenGL的双缓冲机制来避免闪烁。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值