大普通

记事

[Unity3D]如何计算某个pixel的depth precision

摘要

最简单的避免z-fighting的方法是为camera调整一个合适的near clip和far clip,试一试都能出正确的值,但是如何理解这个值。

正文

参考这篇文章:
http://www.sjbaker.org/steve/omniv/love_your_z_buffer.html
这篇文章中有个计算器,通过这个计算器计算出了以下的depth precision。
其中计算depth precision使用到的函数如下(一般人找不到),其中nbit为depth buffer的精度,z为投影空间的深度。具体原理这个函数中公式以及推倒目前没有找到,回头再仔细看看wiki。

function zprec (nbits,zFar,zNear,z)
{
    var b = zFar * zNear / ( zNear - zFar ) ;
    var res = ( b / ( (b/z) - 1.0/(1<<nbits) ) ) - z ;

    if ( res < 0.0001 )
       return res ;
    else
       return Math.floor ( res * 100000.0 ) / 100000.0 ;
}

这个函数能计算出depth precision,depth precision的意义在于,只要两个pixel的z的精度之间的差值,超过了depth precision,则不会发生z fighting。
例如,near clip为0.1,farclip为10,某pixel的z为2,则算出的precision为0.000002360341147422673,所以在这个位置上两个pixel的z之间差值只要大于这个值,就不会发生z-fighting。

最后

算出这个值也没啥意思,文章里的结论说的挺好。

Always put zNear as far from the eye as you can tolerate.

如果near clip和far clip实在两全,那么就使用两个camera。

阅读更多
个人分类: Unity3D
上一篇[Unity3D]如何渲染一个在camera frustum外面的物体
下一篇[Unity3D]清理material中无用的的property
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭