游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4957|回复: 3

请教防止Z fighting的问题.(D3DRS_SLOPESCALEDEPTHBIAS & D3DRS_

[复制链接]

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
发表于 2008-4-15 14:34:00 | 显示全部楼层 |阅读模式
       

        SetRenderState( D3DRS_SLOPESCALEDEPTHBIAS, n );
        SetRenderState( D3DRS_DEPTHBIAS, n );
       
        似乎这两个函数要放在一起使用才可以达到期望中的效果. 不像DXD8中一个就可以搞定.
       
        但是DX9帮助文档里面对它们的说明似乎太概念化.
       
        比如我有A, B两个共Z平面, 我应该怎样设置, 才可以让A画在B的上面?

        SetRenderState( D3DRS_SLOPESCALEDEPTHBIAS, ? );
        SetRenderState( D3DRS_DEPTHBIAS, ? );

        render A;

        SetRenderState( D3DRS_SLOPESCALEDEPTHBIAS, ? );
        SetRenderState( D3DRS_DEPTHBIAS, ? );

        render B;

    这些? 都应该填写什么?

///////////////////////////////////////////////////////////////////////////

        谁愿意讲讲它们的原理?
       
        说明中的公式是什么意思?

        Offset = m * D3DRS_SLOPESCALEDEPTHBIAS + D3DRS_DEPTHBIAS
       
        where m is the maximum depth slope of the triangle being rendered.
       
        m = max(abs(delta z / delta x), abs(delta z / delta y))


        bias = (max * D3DRS_SLOPESCALEDEPTHBIAS) + D3DRS_DEPTHBIAS.
       
       
        这个bias是要大才能被画出来还是怎么样?
       
        我究竟要怎么设置才能完成我拿简单的愿望.............

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2008-4-16 00:13:00 | 显示全部楼层

Re:请教防止Z fighting的问题.(D3DRS_SLOPESCALEDEPTHBIAS & D3DRS_D

两种方法:
1.渲染A时设置 D3DRS_DEPTHBIAS = -0.005f ,D3DRS_SLOPESCALEDEPTHBIAS = 0.001。
1.渲染B时设置 D3DRS_DEPTHBIAS = 0.005f ,D3DRS_SLOPESCALEDEPTHBIAS = 0.001。
不要两个都同时设置。

50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2008-4-16 11:14:00 | 显示全部楼层

Re:请教防止Z fighting的问题.(D3DRS_SLOPESCALEDEPTHBIAS & D3DRS_D




        m_pd3dDevice->SetRenderState( D3DRS_SLOPESCALEDEPTHBIAS, F2DW(g_fSlopeScaleDepthBias) );
        m_pd3dDevice->SetRenderState( D3DRS_DEPTHBIAS, F2DW(g_fDepthBias) );

    我就是想问它们的使用方法.
   

        Dx9 的帮助文档我已经看过很多遍了. 但是就是不真正明白它的意思.
       
        上面说:
       
                bias = (m * D3DRS_SLOPESCALEDEPTHBIAS) + D3DRS_DEPTHBIAS.
               
                where m is the maximum depth slope of the triangle being rendered.
               
                m = max(abs(delta z / delta x), abs(delta z / delta y))


        假设
        Zo 为 Z original ,        就是物体正常被渲染时的Z 值
        Zf 为 Z final,                就是经过偏移后的Z 值.


        它是想说       
       
        Zf = Zo + bias
           = Zo + (m * D3DRS_SLOPESCALEDEPTHBIAS) + D3DRS_DEPTHBIAS

        是这个意思么?

        如果是的话, 也不对啊.
       
        其中, m 有可能是一个非常巨大的值. 这偏移的也太远了.

    在网上可以找到一些片断代码. 没有完整代码. 不同人的设置方法都不一样.
   
   
   
    我自已做试验:
   
   
    在一个全空的空间渲染一个正常的物体.
        
    如果设置成

        mp_d3ddevice->SetRenderState( D3DRS_SLOPESCALEDEPTHBIAS, F2DW( 0.f ) );
        mp_d3ddevice->SetRenderState( D3DRS_DEPTHBIAS, F2DW( 0.0005f ) );

    就渲染不出来.
   
    如果设置成

        mp_d3ddevice->SetRenderState( D3DRS_SLOPESCALEDEPTHBIAS, F2DW( 0.f ) );
        mp_d3ddevice->SetRenderState( D3DRS_DEPTHBIAS, F2DW( -0.0005f ) );

    就可以渲染出来.
   
   
    为什么在没有东西阻挡的情况下设置成 0.f,  0.0005f 也渲染不出来呢?
   
    按照公式, zbias 只有
   
    bias = (m * D3DRS_SLOPESCALEDEPTHBIAS) + D3DRS_DEPTHBIAS.
   
         = 0 + 0.0005 = 0.0005 么.
         
         
    所以说这个公式究竟代表什么????????
   
    有什么书籍专门讲这方面的内容???????
   
    在D3D8中那么简单的一个东西怎么到了9里面变的这么的麻烦????
   

  







50

主题

200

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
 楼主| 发表于 2008-4-16 15:48:00 | 显示全部楼层

Re:请教防止Z fighting的问题.(D3DRS_SLOPESCALEDEPTHBIAS & D3DRS_D

我再顶一下......
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 19:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表