文章目录
渲染过程中可能产生的问题
在绘制3D场景的时候,我们需要决定哪些部分是对观察者 可⻅的,或者哪些部分是对观察者不可⻅的.对于不可见的部分,应该及早丢弃.例如在⼀个不透明的墙壁后,就不应该渲染.这种情况叫做”隐藏面消除”(Hidden surface elimination).
油画算法
- 先绘制场景中的离观察者较远的物体,再绘制较近的物体.
- 例如下面的图例: 先绘制红色部分,再绘制黄色部分,最后再绘制灰色部分,即可解决隐藏面消除的问题
使用油画算法,只要将场景按照物理距离观察者的距离远近排序,由远及近的绘制即可.那么会出现什么问题? 如果三个三⻆形是叠加的情况,油画算法将⽆法处理。
分析
当我们去看一个正方体时,只能最多看到3个面,正方体有6个面,那么其他3个面是看不到的,那么也不需要渲染。所以,我们只需要渲染我们看到的3个面!
那么怎么判断那些面是可见的,哪些面是不可见的呢?即如何告诉OpenGL哪些面是正面。哪些面是反面?
答案就是通过分析顶点数据的顺序
- 正面:按照逆时针顶点连接顺序的三角形
- 背面:按照顺时针顶点连接顺序的三角形
分析:
- 左侧三⻆形顶点顺序为: 1—> 2—> 3 ; 右侧三角形的顶点顺序为: 1—> 2—> 3
- 当观察者在右侧时,则右边的三⻆形方向为逆时针⽅向则为正面,⽽左侧的三⻆形为顺时针则为背面
- 当观察者在左侧时,则左边的三角形为逆时针⽅向判定为正面,⽽右侧的三角形为顺时针判定为背⾯.
正⾯和背面是有三角形的顶点定义顺序和观察者方向共同决定的.随着观察者的⻆度方向的改变,正面背面也会跟着改变。
正背面剔除
从而引入OpenGL的正背面剔除概念
- 开启表面剔除(默认为背面剔除)
void glEnable(GL_CULL_FACE);
- 关闭表面剔除
void glDisable(GL_CULL_FACE);
- 用户选择剔除哪个面(正面/背面)