1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > OpenGl L13深度测试

OpenGl L13深度测试

时间:2021-08-21 01:33:37

相关推荐

OpenGl L13深度测试

一.深度测试

深度缓冲就像颜色缓冲(储存所有的片段颜色:视觉输出)一样,在每个片段中储存了信息,并且(通常)和颜色缓冲有着一样的宽度和高度。深度缓冲是由窗口系统自动创建的。

当深度测试(Depth Testing)被启用的时候,OpenGL会将一个片段的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测试,如果这个测试通过了的话,深度缓冲将会更新为新的深度值。如果深度测试失败了,片段将会被丢弃。

深度缓冲是在片段着色器运行之后运行的。屏幕空间坐标与通过OpenGL的glViewport所定义的视口密切相关,并且可以直接使用GLSL内建变量gl_FragCoord从片段着色器中直接访问。gl_FragCoord的x和y分量代表了片段的屏幕空间坐标(其中(0, 0)位于左下角)。gl_FragCoord中也包含了一个z分量,它包含了片段真正的深度值。z值就是需要与深度缓冲内容所对比的那个值。

现在GPU支持深度测试在片段着色器运行之前,这样我们可以丢弃被遮蔽的片段,节省片段着色器的开销,但前提是在片段着色器中不能修改深度值。

启用深度测试

glEnable(GL_DEPTH_TEST);

更新深度缓存

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

当我们不更改深度缓存时,禁用写入

glDepthMask(GL_FALSE);

1.深度测试函数

设置什么时候丢弃片段,什么时候更新深度缓冲

glDepthFunc(GL_LESS);

2.深度值精度

深度缓冲包含了一个介于0.0和1.0之间的深度值,它将会与观察者视角所看见的场景中所有物体的z值进行比较。

注意,深度缓冲中的值在屏幕空间中不是线性的。深度缓冲中0.5的值并不代表着物体的z值是位于平截头体的中间了,这个顶点的z值实际上非常接近近平面!

3.深度缓冲

在两个平面或者三角形非常紧密地平行排列在一起时会发生,深度缓冲没有足够的精度来决定两个形状哪个在前面。结果就是这两个形状不断地在切换前后顺序,这会导致很奇怪的花纹。这个现象叫做深度冲突。

防止深度缓冲的方法,可以把两个物体偏移一点

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。