【六十四,高级OpenGL-01深度测试】
2020-04-05 本文已影响0人
Woodlouse
深度测试
深度测试(Depth Buffer)防止被遮挡住的面渲染遮挡面的前面,它由窗口自动创建,深度值存储为16,24或32位浮点数,一般是24位。
打开深度测试
glEnable(GL_DEPTH_TEST);
清除上一次的深度缓冲
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
设置深度掩码
glDepthMask(GL_FALSE);
设置深度测试函数
glDepthFunc(GL_LESS);
深度值精度值
线性精度
下面的 (线性) 方程把 z 值转换为 0.0 和 1.0 之间的值 :

效果图如下:

实际正确的投影特性的非线性深度方程是和1/z成正比的,方程如下:


深度冲突
两个平面或三角形如此紧密相互平行深度缓冲区不具有足够的精度以至于无法得到哪一个靠前。结果是,这两个形状不断似乎切换顺序导致怪异出问题。这被称为深度冲突(Z-fighting)。
解决方案
- 让物体之间不要离得太近;
- 近平面设置得远一些;
- 放弃一些性能来得到更高的深度值的精度。大多数的深度缓冲区都是24位。但现在显卡支持32位深度值,这让深度缓冲区的精度提高了一大节;