OpenGL/OpenGL ES学习记录

聊一聊隐藏面消除解决方案

2019-05-16  本文已影响0人  jakeXu

隐藏面消除是什么?

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

如何解决?

方案一(油画算法)

算法原理:先绘制场景中离观察者较远的物体,再绘制较近的物体.

举例说明:如下图,先绘制红色部分,再绘制黄色部分,最后再绘制灰色部分,即可解决隐藏面消除的问题。


油画算法原理图.png

在这种情况下确实解决了隐藏面消除,但是如果是下面这种情况呢,会不会产生问题?如下图所示:


油画算法难以解决图.png
答案是肯定的,三个三角形叠加的情况,油画算法将无法处理。这就是油画算法的弊端。

方案二(正/背面剔除(Face Culling))

正/背面剔除原理:我们不去绘制那些根本看不到的面,以某种方式去丢弃这部分数据。
我们可以给平面定义正面和背面,OpenGL可以做到检查所有正面朝向观察者的面,并渲染它们,从而丢弃背⾯朝向的面。
OpenGL渲染的性能即可提⾼超过50%。

如何告诉OpenGL你绘制的图形,哪个面是正面,哪个面是背面?

方案三(Z-buffer方法(深度缓冲区Depth-buffer))

深度测试判断式.png

以上有不正确的地方欢迎留言指出,有问题随时联系,有需要补充的也可以提出,谢谢。

上一篇 下一篇

猜你喜欢

热点阅读