制作一个购物网站,能在线做英语题目的网站,网站开发需要经历哪些主要阶段,制作一个网站数据库怎么做知识点#xff1a;深度冲突、像素闪烁现象、Reversed-Z#xff08;反向Z#xff09;、浮点数精度问题
前提概要#xff1a;深度值都是由32位浮点数存储
原因#xff1a;深度冲突#xff0c;多个物体之间无法正确地渲染远近关系#xff0c;出现上一帧可能是A物体在B物体…知识点深度冲突、像素闪烁现象、Reversed-Z反向Z、浮点数精度问题
前提概要深度值都是由32位浮点数存储
原因深度冲突多个物体之间无法正确地渲染远近关系出现上一帧可能是A物体在B物体前面下一帧则反过来是B物体在A物体前面每帧的这种远近关系情况都会变化情况下就会产生闪烁表现。
问题1为什么多个物体之间有明确的深度值却在计算机里无法得到正确的远近关系 因为深度值是浮点类型float32其浮点数记录无法保证精确度的它仅有23个二进制有效位保存数据8位是指数位1位是符号位其中23位只是小数有效位若只谈纯整数它有24位有效位2^24代表16777216个整数例如1.1111111....111 小数点后面是23个1指数是2^23那么就会得到 11111111...1111 24个1的二进制数这个最前面的1是默认存在的IEEE754规范 具体浮点数精度问题解释【Unity3d】C#浮点数丢失精度问题_c#double精度-CSDN博客 答案由于无法有足够的精度准确表达出浮点数深度值所以深度相近的2个物体可能会发生闪烁。 注意并不是只有远处的物体会发生闪烁只要2个深度相近到计算机无法用浮点数精确表达的数值那么就会发生不准确而闪烁。 问题2那么为什么远处的物体更容易引发闪烁现象而近处的物体只要不是靠的特别近非重叠都很难发生闪烁现象【本文重点】
答案由于我们的深度值是由32位浮点数存储浮点数的存储结构决定了它的性质是越大的浮点数它的精度越小越小的浮点数它的精度越大精度是指有效小数位数的数量。为什么有这个性质数值越小精度越大数值越大精度越小
很简单的道理当浮点数整数越大时浮点数整数部分占据23位有效二进制位越多自然留给浮点数小数部分的有效二进制位就越少自然精度越小反之当你浮点数整数越小时整数部分占据23位有效二进制越少自然留给小数部分的有效二进制位就越多自然精度越大。
Reversed-Z 反向Z原理为什么可以降低发生闪烁的现象概率
想避免远处物体闪烁就得提高远处物体的深度值存储精度1是用更多二进制位去存储深度2是利用浮点数数值越小精度越大数值越大精度越小性质去改善深度精度情况采用2方案则是利用Reversed-Z技术具体介绍参考如下文章
反向Z(Reversed-Z)的深度缓冲原理 在看完上篇文章之后大概会有个了解就是摄像机NDC归一化之后的远平面深度为0近平面深度为1。正常是近平面是0远平面是1
上面2张图左图Y轴是View深度X轴是反向的NDC深度红点代表有效数值标记越密集代表越多有效值精度高反之精度低。右图Y轴是精度程度X轴是View深度 无论左图还是右图都要以View Space DepthView深度为主轴看 例如左图Y轴[80,100]范围其红色点密集代表深度大的物体能准确表达深度其他范围同理然后你会发现Y轴[0,5]之类的近处小范围它的红点疏散实际上看似很少红点当右图统计[0,20]都有着不错的准确性可能作者没有取更精确的刻度或许[0,5]的精度会变少但反向Z技术保证了[5,100]的范围精度是可靠的即保证大部分深度范围的物体不会闪烁小部分范围闪烁相比较之前的情况要好。
原文将near和far数值继续拉大到10000单位主要看右图远处的精度变小了近处的精度明显变大但整体上来看中、远距离的物体精度仍然有所保证它们的远近关系仍然可以比较不错的表达出来而降低闪烁现象。 下面这张是未使用反向Z之前的效果可看到远处物体的精度几乎是接近0代表远处物体的深度无法正常准确表达会大概率发生闪烁现象。 可以尝试复刻原文画出更精确刻度的右图来获得反向Z后的不同距离的物体深度精度情况。
注意OpenGL NDC是(-1,1)范围的所以无法利用浮点数性质因为远平面和近平面都是趋近于1而非0也就只有中间的物体它的精度值是很高的...尬住了
好像Unity在DirectX平台下默认帮我们处理Reversed-Z但OpenGL则不会了具体如何避免闪烁大多数做法就是把Near拉大就能改善不少缺点是摄像机到近平面距离的物体看不到了。其次就是隐藏或裁剪掉远距离的物体了好像没啥办法。