OpenGL 渲染技巧:深度测试
在不适用深度缓冲区的时候,我们先绘制一个距离比较近的视图,在绘制距离比较远的视图,距离较远的视图会覆盖距离较近的视图。有了深度缓冲区后,绘制视图的顺序就不那么重要了。
实际上,只要存在深度缓冲区,OpenGL 都会把像素的深度值写入到缓冲区中,除非调用 glDepthMask(GL_FALSE) 来禁止写入。
把距离观察者平面(近裁剪面)的深度值与窗口中每个像素点1对1进行关联以及存储;eg:如果一个视图是 120 * 120,则会存储 14400 个深度值。
深度缓冲区 和 颜色缓冲区 是对应的。颜色缓冲区存储像素的颜色信息,而深度缓冲区存储像素的深度信息。在决定是否绘制一个物体表面时,首先要将对应的像素的深度值与当前深度缓冲区的深度值进行比较。如果大于深度缓冲区中的值,则丢弃这部分,否则利用这个像素对应的深度值和颜色值,分别更新深度缓冲区和颜色缓冲区。这个过程称之为 深度测试
far 和 near 是提供到投影矩阵设置可见视图的远近值。
因为开启深度测试后,OpenGL 就不会再去绘制模型被遮挡的部分。但是由于深度缓冲区精度的限制,对于深度相差较小的情况。OpenGL 就可能出现不能正确判断两者的深度值,会导致深度测试的结果不可预测,显示出来的视图会交错闪烁。
让深度值之间产生间隔。可以理解为在执行深度测试之前将立方体的深度值做一些细微的增加,这样就能将重叠的两个图形深度值与之前的有所区分。
通过 glPolygonOffset 来指定;
每个 Fragment 的深度值都会增加如下所示的偏移量:
一个大于 0 的 Offset 会把模型推离距观察者更远的位置,小于 0 的则会把模型拉近
一般而言,只需要将 -1.0 和 1 这样简单赋值给 glPolygonOffset 基本就可以满足需求
在 OpenGL 中有一种提高渲染的方式;只刷新屏幕上发生变化的部分。OpenGL 允许将要进行渲染的窗口只去指定一个裁剪框。
用于渲染时限制绘制区域;通过此技术可以在屏幕(帧缓冲)指定一个矩形区域。启用裁剪测试之后,不再此区域内的片源将被丢弃,只有再次矩形区域内的片元才有可能进入帧缓冲。因此实际达到的效果就是在屏幕上开辟一个小窗口,可以再其中指定内容的绘制。