關於ATI顯卡的一個奇怪問題?

近日編寫shader的時候發現一個奇怪的問題,在我的6200卡上以下shader代碼可以正確的計算出結果,而在ATI 9600的卡上就是錯誤的,查了很多資料還是百思不得其解,那就當做一點點經驗把它記錄下來,以後再有朋友遇到類似的問題就不用像我這樣逐行代碼排除找錯誤了:)

在我的shader裏,有這樣兩行代碼,用於算像素normal:

float3 vNormal=normalize(2*(vA+vB)-2);
...... 省略若干不相關代碼
float NdotL=max(dot(vNormal,eyeDir),0);

這裏vA,vB都是float3,來自於bump貼圖取樣和vs輸入,在我的6200卡上可以正確計算出結果,也就是說NdotL的取值是[0,1]之間,而在同事的ATI 9600卡上, NdotL的結果是恆爲0,經過逐行排除測試,最終發現是

float3 vNormal=normalize(2*(vA+vB)-2);

導致錯誤,vNormal的計算結果不在預期,將代碼調整爲:

float3 vNormal1=2*vA-1;
float3 vNormal2=2*vB-1;
float3 vNormal=vNormal1+vNormal2;
vNormal=normalize(vNormal);

問題得以解決,開始以爲是同事的機器的DX版本太低,導致fxc編譯出來的shader代碼有錯誤,可是我和同事互相掉換fxo後,同事問題依舊,而我同樣是正常,在令一同事的ATI 9800卡也是正常的,至此得出結論ATI 9600卡硬件設計可能存在問題,因爲驅動已經更新至最新;抑或是DX的fxc編譯的shader代碼移植性不高,因爲同樣的代碼使用nVidia CG編寫在9600上是沒有問題的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章