1.從「模型空間」到「世界空間」(object to world):
(1)方法1,使用和「頂點」到「世界」變換矩陣的「逆轉置矩陣「對法線進行相同的變換,因此先得到頂點的模型到世界的變換矩陣的「逆矩陣」(unity_worldtoobject),然後通過調換它在mul函式中的位置,得到和轉置矩陣相同的矩陣乘法,由於法線是乙個三維向量,因此我們只需要街擷取unity_worldtoobject的前三行前三列:
worldnormal = normalize(mul(v.normal,(float3x3)unity_worldtoobject))
最外側的運算「normalize(x)」表示歸一化。
ps :unity_worldtoobject 在mul 中的 的位置 使它變成 轉置矩陣,加上它又是逆矩陣,變成了 逆轉轉置矩陣
(2)使用unity內建的語法「unityobjecttoworldnormal()」。
這是unity5.x在中,可以通過「內建著色器」中的「unity.cginc」中找到相關的用法,截一小段**:
// transforms normal from object to world space
inline float3 unityobjecttoworldnormal( in float3 norm )
return normalize(mul(norm, (float3x3)unity_worldtoobject));
#endif
}
注釋已經寫的很清楚了「把法線從模型空間變換到世界空間」,裡面做了個判斷。如果是「統一縮放」那麼這個方法用的是「unityobjecttoworlddir()」,如果是非統一縮放,則用「normalize(mul(norm, (float3x3)unity_worldtoobject)」,這個就是和「方法1」是一模一樣的。之所以這種寫法,就是為了保證模型「非統一縮放」也不會得到錯誤的法線。
而unity封裝的這個方法,就解決了,不管模型是不是統一縮放,用這個肯定沒有錯。在unity4.x和之前,是不用管是不是統一縮放的,因為當模型縮放後,unity會在背後重新生成乙個模型,和縮放後的一樣大,從而法線肯定不會錯。但是unity5.x及以後,就必須要注意這個問題。
下面看一下在shader中,怎麼使用這個方法:
normaldir = unityobjecttoworldnormal(v.normal)
很簡單的一句話。 Shader中的結構體
cg語言中支援結構體 structure unity中的shader當然也支援了,實際上shader中的結構體宣告 使用和c 非常的類似,但是還是不同的。用法 1.結構體的宣告以關鍵字 struct 開始,然後緊跟結構體的名字,接下來是乙個 大括號,並以分號結尾 不要忘了分號 2.使用 引用結構體中...
unity中shader的Cutout問題
unity中自帶的shader裡有cutout型別的shader,今天發現這種型別很詭異,先 貼幾種自帶的 shader transparent cutout diffuse cutoff alpha cutoff range 0,1 0.5 subshader lod 200 cgprogram ...
vs中編寫shader設定高亮
經測試,以下兩種方法在vs2013上都有效。方法一 1.建立或編輯usertype.dat檔案 此檔案在vs安裝目錄下的common7 ide下面,比如我的就在d program files microsoft visual studio 8 common7 ide usertype.dat 新增如...