|
|

楼主 |
发表于 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里面变的这么的麻烦????
|
|