关闭

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

604人阅读 评论(0) 收藏 举报
分类:

摘要

最简单的避免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。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:11245次
    • 积分:428
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论