2011-11-08 47 views
2

我已經完全重寫了第一篇文章,以更好地顯示問題所在。正常化HLSL中的矢量錯誤

我使用的是ps v1.4(我支持的最高版本)並且不斷收到錯誤。
它發生在任何時候我使用任何類型的功能,如COS,點,距離,sqrt,normalize等傳遞到pixelshader的東西。
例如,我需要做「normalize(LightPosition - PixelPosition)」來在我的pixelshader中使用點光源,但normalize會給我一個錯誤。
有些事情要注意 -
我可以使用像pow,abs和radians這樣的東西,沒有錯誤。
如果完成了從頂點着色器傳遞的某些內容,則只有一個錯誤。 (例如,我可以在沒有錯誤的情況下獲取本地像素變量的sqrt)
我從傳入的任何變量,即使是文本座標,顏色等等,都會產生錯誤。
頂點着色器內部我可以做所有這些函數在任何變量傳入時都沒有錯誤,只有在pixelshader中我得到一個錯誤
從頂點傳遞到像素着色器的所有值都是正確的,因爲如果我使用軟件處理而不是硬件,則不會得到錯誤和完美照明的場景。
由於規範化向量本質上是我的錯誤形成的地方,我嘗試創建我自己的規範化函數。
我稱之爲規範(LightPosition - PixelPosition)和「規範」是這樣的 -

float3 Norm(float3 v) 
{ 
    return v/sqrt(dot(v, v)); 
} 

我仍然得到錯誤,因爲我想在技術上我仍然試圖採取pixelshader內開方。

的錯誤是沒有任何具體的,它只是說,在那裏我打開我的.fx文件在C#中的行「錯誤應用」
我想它實際上是一個編譯錯誤,因爲我必須使用這樣的舊版本(VS 1.1和PS 1.4)
使用fxc.exe它告訴我「的指令不能映射到像素着色指令集」調試

+0

你得到了什麼錯誤? – ssube

+0

什麼是錯誤?這是在像素還是頂點?你確定你的GPU是10歲,只支持1.1?我不認爲這些舊平臺經過了非常多的測試,所以很可能是編譯器錯誤。 –

+0

每一點都可以在這裏找到http://www.riemers.net/eng/Tutorials/DirectX/Csharp/Series3/The_first_light.php我不認爲我的GPU是10歲,但我檢查了DevCaps。 VertexShaderVersion,它給了我1.1。關於錯誤,它是int pixelshader,它給我一個我加載我的行上的錯誤。fx文件(在C#中) – Frobot

回答

1

舊GPU:■並不總是支持任何指令,特別是在像素着色器。

您可能會在頂點着色器中得到一個sqrt,但對於一個如此舊的版本(1.1 !!),片段着色器可能會非常有限。

即,這可能不是一個錯誤。

解決方法是跳過hlsl並編寫自己的彙編程序(但您可能偶然遇到同樣的問題)並模擬sqrt(例如,如果您可以使用紋理查找和/或插值1.0 :-p)

你當然可以嘗試在hlsl中編寫sqrt-lookup/interpolation,但它可能太大了(我不記得但是IIRC 1.1不允許你寫很長的着色器) 。

+0

經過一些更多的研究,我相信它只是不支持的。這似乎很難相信,因爲這使舊版本中的像素着色器幾乎無用。 – Frobot

+0

+1謝謝:-)(順便說一句,如果你可以改變你的,即不是筆記本電腦/筆記本電腦,接受至少2.0或3.0的GPU應該很便宜) – Valmond