2012-10-20 55 views
1

我使用Blendshape代碼中的數據鎖定並填充Direct3d9中每一幀的頂點緩衝區。我的着色使用兩個步驟,所以我使用一個着色器渲染一次,然後使用其他着色器繪製疊加混合。Z-fighting Direct3D9,只有動態緩衝區

由於我之外的原因,我的頂點緩衝區中的數據(顯然)在這兩個繪圖調用之間略微不同,因爲我有閃爍的z戰鬥,第二遍有時會在第一遍後面渲染。

這一切都是在一個線程中完成的,並且緩衝解鎖渲染調用之前很長一段時間。此外,不會更改任何着色器指令,因此數據應該是,這兩個調用中的完全相同。如果混合形狀不發生變化,則不會發生z戰鬥。

現在我「推」的深度在我的渲染一點,但是這是一個非常不雅的解決方案。

這個數據爲什麼可以改變?爲什麼DirectX可以在解鎖後更改緩衝區中的數據?我可以強迫它不要改變它嗎?

回答

1

1st。你確定數據真的被D3D改變了,或者這只是假設?我相信D3D不會更改您的數據。

2nd。如你所說,你有兩個不同的着色器繪製你的幾何圖形。他們擁有不同的改造行動。或者因爲優化,着色器中的轉換可能會有所不同,這就是爲什麼您的轉換頂點可能略有不同(但足以用於z戰鬥)。我建議在一個着色器/技術中使用兩遍。 或者如果您仍然想使用兩個着色器,則最好使用共享代碼進行轉換和其他標識操作。

0

我可以肯定的是,D3D運行時間不會改變你在一個頂點緩衝傳遞的任何數據,我不喜歡你同樣的事情時呈現兩層的地形,沒有Z-戰鬥。但是,確實有一些渲染狀態會在將三角形柵格化爲像素時發生變化,它們是D3D9中的D3DRS_DEPTHBIAS和D3DRS_SLOPESCALEDEPTHBIAS,或D3D10_RASTERIZER_DESC結構中的相等值。如果這些渲染狀態改變了,你應該檢查它們。

你還需要確保所有的着色器做的計算與位置處的轉換矩陣或其他常量的恰恰相等,否則會出現Z-戰鬥。

我建議你使用一些圖形調試工具來檢查一下。如果您使用NVIDIA卡,則可以使用PIX或PerfHUD或Nsight。

我爲我的英語不好對不起,它必須是很難理解。但我希望這可以幫助你,謝謝。