下图是我们要修改后的效果图:
一、深度检测
1、模型Z轴显示有问题:
上一次试验中,如果认真留意,会发现一个问题。当控制锥体在左右或上下旋转时,你会发现锥体看起来是在+-180度之间来回摆动,而不是360度的旋转。锥体的底面总是朝向观察者。这个我们可以通过修改锥体底面的颜色方便观察。如下图:
正如上面的两幅图,在不同的角度看,底面永远都是在最上面。其实这是跟我们前面代码上的画图有关。前面我们的代码是,先画锥体的侧面,再画底面。类似于我们小学画画时一样,最后画的都是把前面画的给覆盖了。
那应该怎样处理这个问题呢?
2、怎样处理Z轴显示的问题:
这个问题不需要我们操心,OpenGL已经帮我们处理好了。我们只需要添加一个语句,开启OpenGL的深度检测。
glEnable(GL_DEPTH_TEST);
3、深度检测原理
OpenGL在2D平面绘制3D场景时,对每一个绘画的像素点都分配一个Z轴的值(即这个点在3D场景里距离观察者的距离)。有一个深度缓冲区,每次绘画一个像素点就会把该像素点的信息添加进深度缓冲区中。绘制新的像素点时,先判断在同一个2D位置是否已经绘画过像素点,如果是,判断新绘画的像素点的Z轴是不是比已经花了的Z轴更接近观察者,如果是则覆盖掉前面的像素点,修改深度缓冲区,否则不需要画该像素点。
注意:每帧前我们都需要清空深度缓冲区,否则会导致z轴判断错误。因为每一帧中,某个像素点的z轴的值可能会变化。
glClear(GL_DEPTH_BUFFER_BIT);
4、增加深度检测后的效果
加入深度检测后:
二、剔除隐藏表面
1、剔除隐藏表面好处
首先介绍绘图的底层工作原理,有一个3D模型,首先我们先确定需要绘制的3D模型的像素点,把这些像素点发送给计算机图形处理(GPU)相关硬件;相关硬件把这个3D模型绘制到2D屏幕上会检测Z轴(我们前面说到的深度检测)。
从上面的工作步骤我们容易发现,对于3D模型背后的部分,有时我们不需要画出来,可是还是进行了Z轴检测。如果我们在前面处理,直接把背后我们看不见的部分,不用发送给GPU处理的相关硬件,将会提升渲染性能。
这种剔除技术就是“回溯剔除”,回溯剔除将剔除掉3D模型的内部。使用回溯剔除能大大提升渲染性能。
2、正面与背面
在上一节中,我们讲了怎样通过3角形绕出3D模型。我们通过三角形绕出来的面,有正面、背面。
按照OpenGL的约定,通过顺时针绕法,绕出来的面,我们看到的是正面,另外一面是背面,
如上图所示,对于底面,上面(靠近侧面的一面)是正面,底面是背面。对于侧面