編寫Unity Shader的時候,語義POSITION和SV_POSITION的區別?

編寫的Shader是兩個很簡單的頂點著色器和片元著色器:

struct a2v

{

float4 vertex : POSITION;

float3 normal : NORMAL;

float4 texcoord : TEXCOORD0;

};

struct v2f

{

float4 sv_pos : SV_POSITION;

fixed3 color : COLOR0;

};

/*Unity在此報錯*/

v2f vert(a2v v) : SV_POSITION

{

v2f o;

o.sv_pos = mul(UNITY_MATRIX_MVP, v.vertex);

o.color = v.normal * 0.5 + fixed3(0.5, 0.5, 0.5);

return o;

}

fixed4 frag(v2f i) : SV_Target

{

fixed3 c = i.color;

c *= _Color.rgb;

return fixed4(c, 1.0);

}

函數vert使用了語義SV_POSITION作為輸出

在Unity中調試的時候,發現如果使用DirectX11的話,則會出現以下錯誤提示:

Shader error in "Custom/Shader2": invalid output semantic "SV_POSITION": Legal indices are in [0,0] at line 41 (on d3d11)

並且Shader無法正常工作:

而將圖形介面改為DirectX9的話,則不會出現以上情況:

我對語義的概念並沒有理解透徹,網上看到的資料顯示,如果是DX10之後的版本就可以使用SV_POSITION作為vertex shader的輸出了,但在我這裡好像並不是這樣。

就這個機會,想了解如何解決上述問題以及這兩個語義的區別在哪裡,十分感謝~!!!!!


代碼寫錯了→_→

去掉vertex main後面的語義

v2f vert(a2v)

{}

你結構體體裡面已經有語義了

函數上語義的寫法是對返回值進行修飾的


哈哈,你是在Unity Shader入門精要中看到的吧,書中寫錯了

這個作者搞了一個勘誤,上面有,

具體請看: http://candycat1992.github.io/unity_shaders_book/unity_shaders_book_corrigenda.html


非原創,別處看到的:

SV_前綴的變數代表system value,在DX10以後的語義綁定中被使用代表特殊的意義,和POSITION用法並無不同。唯一區別是 SV_POSTION一旦被作為vertex shader的輸出語義,那麼這個最終的頂點位置就被固定了(不能tensellate,不能再被後續改變它的空間位置?),直接進入光柵化處理,如果作為fragment shader的輸入語義那麼和POSITION是一樣的,代表著每個像素點在屏幕上的位置(這個說法其實並不準確,事實是fragment 在 view space空間中的位置,但直觀的感受是如括弧之前所述一般)

最後這個回答者說了,在DX10版本之前沒有引入SV_的預定義語義,POSITION被用作vertex shader的輸入,輸出,fragment shader的輸入參數。但DX10之後就推薦使用SV_POSITION作為vertex shader的輸出和fragment shader的輸入了,注意vertex shader的輸入還是使用POSITION!切記。但是DX10以後的代碼依舊兼容POSITION作為全程表達,估計編譯器會自動判斷並替換的吧。

原鏈接:

cg語言 SV_POSITION vs POSITION


"When SV_Position is declared for input to a Pixel Shader, it can have one of two interpolation modes specified: linearNoPerspective or linearNoPerspectiveCentroid, where the latter causes centroid-snapped xyzw values to be provided when multisample antialiasing. When used in a pixel shader, SV_Position describes the pixel location. Available for read/write in the vertex shader and geometry shader. The pixel shader can use it as read only to get the pixel center with a 0.5 offset."

http://blog.csdn.net/pizi0475/article/details/46695831


推薦閱讀:

Shader model 5.0 的片段著色器能不能得到該片段所在的三角圖元實際光柵化後有多少像素?
為什麼半透明模型的渲染要使用深度測試而關閉深度寫入?
iOS 9 用的是哪種模糊演算法?
Unity5.X中屏幕空間陰影投射技術(Screenspace ShadowMap)如何產生陰影圖?

TAG:Unity遊戲引擎 | shader |