ios 开发

OpenGL正背面剔除

2023-01-02  本文已影响0人  iOS小洁

隐藏⾯面消除 Hidden surface elimination

在绘制3D场景的时候,我们需要决定哪些部分是对观察者可见的,或者哪些部分是对观察者不可见的.对于不可见的部分,应该及早丢弃.例如在⼀个不透明的墙壁后,就不应该渲染.这种情况叫做”隐藏⾯面消除”(Hidden surface elimination).

在甜甜圈案例中,设置观察者到物体的距离,设置观察者到物体的距离,即观察者动,物体不动,并创建一个甜甜圈如下,在转到的时候出现了如下动图的问题。这便是隐藏⾯面消除产生的

<img src="http://xingyajie.oss-cn-hangzhou.aliyuncs.com/uPic/1028.png" alt="img" style="zoom: 27%;" /><img src="http://xingyajie.oss-cn-hangzhou.aliyuncs.com/uPic/1036.gif" alt="img" style="zoom: 25%;" />

为什么使用默认光源着色器会出现隐藏面消除?

使用平面着色器绘制甜甜圈,会出现隐藏面消除吗?

油画算法

image-20220720141042992

油画算法的弊端:

正背面剔除

OpenGL 可以做到检查所有正面朝向观察者的面,并渲染它们.从⽽丢弃背面朝向的⾯. 这样可以节约片元着⾊器的性能.

正反面区分

//mode参数为: GL_CW,GL_CCW,默认值:GL_CCW
void glFrontFace(GLenum mode);

相关方法:

//开启表面剔除 (默认背面剔除)
void glEnable(GL_CULL_FACE);

//关闭表面剔除(默认背面剔除)
void glDisable(GL_CULL_FACE);

//GL_FRONT 正面
//GL_BACK 背面
//GL_FRONT_AND_BACK 正背面
//默认GL_BACK
void glCullFace(GLenum mode);

//例如,剔除正面实现(1)
glCullFace(GL_BACK); 
glFrontFace(GL_CW);
//例如,剔除正面实现(2) 
glCullFace(GL_FRONT);
上一篇下一篇

猜你喜欢

热点阅读