当前位置: 首页 > 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/news/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 服务发布后无法访问
  • 【Redis数据库】异地公网远程登录连接Redis教程
  • SpringBoot接口 - 如何实现接口限流之单实例
  • webgl-画三角形
  • vue+element-plus上传图片功能以及回显问题还有数量限制
  • 精通 NumPy 数值分析:6~10
  • c/c++:二维数组,数组的行数和列数求法sizeof,数组初始化不同形式,5个学生,3门功课,求学生总成绩和功课总成绩
  • Python操作MySQL就是这么简单
  • ROS开发之如何使用ICM20948 IMU模块?
  • Ubuntu20.04安装matlab2022b
  • 面试官在线点评4份留学生简历! 这些坑你中了几个?如何写项目描述才能被大厂发面试?转专业简历该咋写 | 还有优秀简历展示!