位置: 编程技术 - 正文

openGL4.X 深度测试(depth testing) framebuffer中(opengl 4.2)

编辑:rootadmin
深度测试 depth testing

推荐整理分享openGL4.X 深度测试(depth testing) framebuffer中(opengl 4.2),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:opengl开启深度测试,opengl性能测试,opengl 4.4,opengl深度值与z值,opengl深度值与z值,opengl测试软件,opengl性能测试,opengl深度值与z值,内容如对您有帮助,希望把文章链接给更多的朋友!

作为openGL渲染的最后一步,在fragment shader之后,依次进行 裁剪测试->模板测试->深度测试

当深度测试开启之后(默认关闭),gl会把每个从fragment shader中生成的fragment(像素片段)的深度值与frame buffer中相应的fragment的深度值进行比较。如果通过了深度测试(由你定义通过的条件)那么frame buffer中的fragment被新生成的fragment所替代。相反没通过则丢弃所生成的fragment。

primitive assemble(几何基元组装)是由一个顶点位置集合(set)按顺序组成。每个顶点都有z轴坐标值。 这个坐标被放缩,偏移使其落在0到1之间,负数表示在摄像机屏幕之后,眼睛的后面,这个范围被视为正常可见范围(当然你也可以设置成所有范围可见无论0-1,但通常我不建议这么做,除非你写的是外挂。。呵呵)。随后深度测试时,就测试framebuffer中的深度值与新生成的fragment哪个深度值从正向更趋近于0,0代表眼睛的位置。1代表无限远。。具体参见齐次坐标系。

就像上面所述的那样,你可以选择自己想要的深度比较函数,来决定是否它应该通过测试,而非默认的正向靠近0作为通过条件。设置深度比较函数,使用glDepthFunc(),它的原型是

这里的func是可选深度比较操作函数之一,合法可选值在下表。

参数(function) | Meaning GL_ALWAYS | 深度测试永远通过,所有生成的fragment都取代旧fragment GL_NEVER | 深度测试永远不通过,所有生成的fragment皆抛弃 GL_LESS | 如果新fragment深度值比旧fragment深度值更小则通过 GL_LEQUAL | 如果新fragment深度值比旧fragment深度值更小或相等则通过 GL_EQUAL | 如果新fragment深度值比旧fragment深度值相等则通过 GL_NOTEQUAL | 如果新fragment深度值比旧fragment深度值不相等则通过 GL_GREATER , GL_GEQUAL 类似

深度值夹紧 depth clamping

OpenGL把每个片段fragment的深度放缩到0-1之间的一个有限范围内。片段的深度值为0的话则表明它与近裁截面重合相交(如果是真实世界的话就是刺入你的眼睛),1代表物体的最远距离,但不是无限远。为了消除远裁截面并在任意距离上绘制图形,我们需要在深度缓存depth buffer中储存任意大的深度值–当然这是计算机不可能实现的。为了绕过这个坑,openGL可以用深度数值夹紧到0-1范围选项来关闭近远截面所造成的截面。这意味着任何在近平面之前,和远平面之后的几何都都会被最终投射到平面之上从而被看见。

为了开启深度值夹紧(同时关闭近远切平面),我们调用

禁止深度夹紧

openGL4.X 深度测试(depth testing) framebuffer中(opengl 4.2)

下图显示了开启深度值夹紧开启时直线横穿近平面时所产生的效果。

我们可以看见穿出近平面虚线被投射到近平面上。如同最右侧图一样。 最终黑色线条被全部写入深度缓存depth buffer当中。下图显示了实际应用所表现的效果。 在左侧的图,几何模型靠观察者太近,以至于部分模型穿出了近平面之前,所以部分几何被截断。这一部分被截断的几何不会被绘制出来,表现为模型上的一些孔洞。这是深度缓存中的深度值没有被转换成标准显示范围0-1内,所以图像显得不正常。

前期测试

逻辑上来说深度和模板测试是发生在fragment从shader渲染之后,但是现在大多数显卡支持这些测试在fragment进入shader之前,这样就避免了执行shader渲染然后再测试抛弃这些不用的fragment所带来的额外开销时间。但不管怎么样,如果shader有额外效应如直接写如纹理贴图等操作应谨慎使用前期测试。

一个特殊的例子是你可以在shader中停止opengl执行深度测试,只要写入opengl fragment shader中一个内置的输出(output)变量gl_FragDepth。 这个特殊的内置输出(output)变量gl_FragDepth可以被写入值用以刷新深度缓存中的深度值。如果fragment shader不用这个变量,那么一个插值过的深度值将会被使用。你的fragment shader可以计算一个全新的值赋给gl_fragDepth,或也可以获取gl_FragCoord.z的值赋予它。这个全新的值会直接通过深度检测。你可以使用这个特性,去稍微改变深度缓存,来造出一个凸起的平面。当一个新的物体被深度测试时,结果取决于shader。

因为你的shader改变了fragment的深度值,所以opengl没有办法在shader之前执行深度测试。为了解决这种情况,opengl提供了一些layout qualifiers让你告诉它你打算对深度值做什么操作。

记住,深度缓存中的深度值是介于0-1之间,深度测试的比较操作包括GL_LESS和GL_GREATER。如果你在shader中设置了一个值小于当前值,那么他就会被渲染。

layout qualifier 可以让你告诉opengl你要对gl_Fragment做什么

下列是一些你可以申明的

如果你使用depth_any,就等于告诉opengl你可能对gl_FragDepth写入任意值。这时opengl完全不知道你要干什么。如果你指定为depth_less,那么你告诉opengl任意写进gl_FragDepth的值都小于现在的depth buffer中的深度值(即使实际上比它大)。同理depth_greater。 最后一个qualifier,depth_unchanged比较特殊。它告诉opengl你写入gl_FragDepth中的任意值对现有的显示方式都没有影响(但它依旧被写入)。这个方法让你可以稍微改变深度值,但不想因为新的深度值而与现有其他几何相交。

无论你在gl_FragDepth上应用了什么layout qualifier,opengl决定用什么方式来接受处理这个值得显示方式。你写入gl_FragDepth中的值一定会被夹紧到0.0-1.0范围内(根据远近平面的距离值,超出后就变成1或者0)并写入进depth buffer深度缓存当中! 如果你不用gl_FragDepth的话,opengl会根据你的选项和显示方法决定是否替换深度缓存中的深度值,或者抛弃这个值,而gl_FragDepth永远不会抛弃掉它。

The graphics pipeline ,Open GL 渲染管线 来源:

Following the pipeline 1.PassingDatatotheVertexShaderThevertexshaderisthefirstprogrammablestageintheOpenGLpipelineandhasthedistinctionofbeingtheonlymandatorystageinthepipeline.VertexAttributesInGLSL,themechanismforgettingda

Tutorial 4: Shaders 本文源自:

标签: opengl 4.2

本文链接地址:https://www.jiuchutong.com/biancheng/369417.html 转载请保留说明!

上一篇:在Unity3D的Legacy动画系统中应用Root Motion(unity3d ide)

下一篇:The graphics pipeline ,Open GL 渲染管线

  • 个人所得缴税租房减免该怎么弄?
  • 公司注销后账本怎么处理
  • 孳息和利息的区别
  • 当月减少的固定资产当月停止折旧
  • 中央空调折旧年限是多久
  • 分期付款方式购入货物会计分录
  • 外资企业采购流程
  • 企业接受外部劳务派遣用工支出税前扣除问题
  • 计提坏账准备确认的信用减值损失累计金额
  • 物流运输途中损坏怎么办
  • 计提工会经费是按应付职工薪酬的借方还是贷方
  • 收到投资分红要缴纳企业所得税吗?
  • 增值税普通发票有什么用
  • 安装工程发票怎么开
  • 成本控制的基本原则包括
  • 电商企业如何确定产品结构
  • 软件行业研发费用比例有要求么
  • 个人出租房屋给公司可以开专票吗
  • 以前月份个税没交怎么办
  • 地下车库怎么缴费
  • 单位个税申报后可以撤销吗
  • 关闭445端口方法命令
  • macos big sur怎么运行ios软件
  • 购进农产品发生非正常损失
  • vue ui怎么用
  • 购买二手商住房没有给契税发票和购房发票
  • php机试题
  • 固定资产减值准备可以转回吗
  • php实现页面浏览量
  • php封装数据库连接
  • uniapp使用高德地图直接进行导航
  • AttributeError: cannot assign module before Module.__init__() call
  • df 命令执行显示不出来
  • 从univ.txt文件中去掉机构名称
  • 货物运输业增值税
  • 搜索站内内容
  • python knn算法和结果
  • sql自增1
  • 公司员工私车公用协议
  • 单位财务报销制度和流程
  • 建设工程合同从完成承包的内容进行划分
  • 未开票收入确认错属期滞纳金怎么办
  • 生产车间计提费用会计分录
  • 营改增试点纳税人提供技术转让
  • 广告类的公司
  • 有限合伙企业需要缴纳企业所得税吗
  • 汇算清缴补交所得税的分录
  • 应付账款二级科目可以是个人吗
  • 行政事业单位会计风险来源于日常的会计活动
  • 补充资本金有哪些途径
  • 进项税额允许抵扣分录
  • 税务报表工会经费是按什么交了
  • 外贸企业怎么开出口发票
  • xp系统安装版如何安装
  • ubuntu-desktop启动
  • MAC怎么将单独一个应用静音
  • ubuntu 15.04系统怎么安装qq?
  • linux版的oracle
  • 电脑图片密码是什么意思
  • win8系统与win10哪个好
  • win10 20h2 04累积更新
  • mac怎么共享打印机设备
  • windows 7安装步骤
  • win10桌面是什么样的
  • Win10 Mobile RedStone预览版14267更新内容汇总(持续更新)
  • [置顶] 关于UNITY5.0和高通AR4.2.3在手机上白屏的问题
  • if iferror find
  • shell delete
  • html中的表格
  • python回归结果输出
  • js入门基础教程
  • 第五章推动经济高质量发展心得
  • 基础的十进制按什么来算
  • 512到底是什么意思
  • 成都国家税务局每个月交全民付的钱是什么
  • 北京增值税普通发票图片
  • 福建省税务局 电子
  • 广东省地税局网上办税
  • 个人领税票需要哪些资料
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设