当前位置: 首页 > article >正文

第三十三章 深度测试总结

渲染一个物体,可以用深度缓冲来防止被阻挡的面渲染到其他面的前面。
深度缓冲就像是颜色缓冲一样,在每个片段中存储了信息,通常和颜色缓冲有一样的宽度和高度。在大部分的系统中,深度缓冲的精度是24位,以float的形式存储它的深度值。

深度测试被启用的时候,OpenGL会将一个片段的深度值与深度缓冲的内容进行对比,如果在OpenGL执行的深度测试后,通过了则会将其更新为新的深度值,如果测试失败,则片段被丢弃。
深度缓冲是在片段着色器运行之后,也是在模板测试运行之后,在屏幕空间中运行的。屏幕空间坐标与通过OpenGL的glViewport所定义的视口密切相关,可以直接使用GLSL 内建变量gl_FragCoord从片段着色器直接访问。该函数的x和y分量代表了片段的屏幕空间坐标(0,0是左下角)。注意:gl_FragCoord中包含一个z分量,包含了片段真正的深度值。z值就是需要与深度缓冲内容所对比的值。

补充:大部分的GPU都提供一个提前深度测试的硬件特性。允许深度测试在片段着色器之前运行。只要清楚一个片段永远不会是可见的,则就可以提前丢弃这个片段。片段着色器的开销较大,应尽可能避免运行它们。当使用提前深度测试时,片段着色器的一个限制是不能写入片段的深度值。

深度测试默认禁用的,要启用的话,需要使用函数glEnable:
glEnable(GL_DEPTH_TEST);
启用后,如果一个片段通过了深度测试,则OpenGL会在深度缓冲中存储该片段的z值;如果没有通过深度缓冲,则会丢弃该片段。如果启用了深度缓冲,还应该在每个渲染迭代之前使用GL_DEPTH_BUFFER_BIT来清除深度缓冲,否则会还在使用上一次渲染迭代中的写入的深度值:


http://www.kler.cn/a/11753.html

相关文章:

  • 面试官:谈谈你对领域模型设计(DDD)的理解和心得
  • Mybatis(八)动态Sql的实现原理
  • 「MongoDB」时序数据库和MongoDB第二部分-模式设计最佳实践
  • 【NLP实战】基于Bert和双向LSTM的情感分类【下篇】
  • RGB与YUV
  • PageHelper的使用
  • 得物 API一站式协作平台的一些思考
  • 2023年阿里云新用户轻量应用服务器价格表(精准报价)
  • 【C语言数组部分】
  • 矿泉水为什么会溴酸盐超标
  • QT网络通信-服务器(一)
  • Dva.js(基础、简单例子解读)
  • Mysql 学习(五)InnDB 存储引擎-B+树索引的使用
  • 每日学术速递4.11
  • Ceph Ansible 和 Cephadm 之间的比较
  • Session、Cookie和Token
  • vue3 组件篇 Message
  • 人工智能动物农场的猪、牛和蟑螂
  • 《C++高并发服务器笔记——第四章》
  • node 服务发布后无法访问