unity shader 中 mul(_Object2World,v.vertex).xyz 等于 UnityObjectToClipPos(v.vertex);嗎?
1 回答

慕標5832272
TA貢獻1966條經驗 獲得超4個贊
完全不是一個東西。
float3 worldPos = mul(_Object2World, v.vertex).xyz;
這是把頂點從模型空間(物體的本地坐標空間)轉化到世界空間中,并取xyz分量;其中,_Object2World是轉化矩陣。
UnityObjectToClipPos(v.vertex);
這個是把頂點從模型空間直接轉化到裁剪空間,也就是進行了M-V-P三次轉化,這個函數是unity重新封裝過一次,其實它最初是mul(UNITY_MATRIX_MVP,v.vertex);其中,UNITY_MATRIX_MVP是轉化矩陣。
既然可以直接轉化為什么還要得到世界空間中的頂點位置?
這是因為很多時候我們需要在片元著色器中進行一些特殊的運算,這些運算需要世界空間中的頂點位置,例如,光照模擬,凹凸映射等。
另外建議你先充分熟悉GPU渲染流水線再學習Shader,不然很多問題你都可能覺得莫名其妙。
添加回答
舉報
0/150
提交
取消