為了把頂點(diǎn)或方向矢量從觀察空間變換到模型空間
// 方法一坦刀, 使用transpose 函數(shù)對(duì)UNITY_MATRIX_IT_MV 進(jìn)行轉(zhuǎn)置,
// 得到UNITY_MATRIX_MV 的逆矩陣鲤遥,然后進(jìn)行列矩陣乘法沐寺,
// 把觀察空間中的點(diǎn)或方向矢量變換到模型空間中
float4 modelPos = mul(transpose(UNITY_MATRIX_ IT_MV), viewPos);
// 方法二盖奈, 不直接使用轉(zhuǎn)置函數(shù)transpose 混坞,而是交換mul 參數(shù)的位置钢坦,使用行矩陣乘法
// 本質(zhì)和方法一是完全一樣的
float4 modelPos = mul(viewPos, UNITY_MATRIX_IT_MV);
TRANSFORM_TEX(v.texcoord, _MainTex);
TRANSFORM_TEX方法比較簡(jiǎn)單,就是將模型頂點(diǎn)的uv和Tiling爹凹、Offset兩個(gè)變量進(jìn)行運(yùn)算厨诸,計(jì)算出實(shí)際顯示用的定點(diǎn)uv逛万。
該方法可以在UnityCG.cginc文件中找到,內(nèi)容也很簡(jiǎn)單:
// Transforms 2D UV by scale/bias property
define TRANSFORM_TEX(tex,name) (tex.xy * name##_ST.xy + name##_ST.zw)
配合使用時(shí)的代碼:
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
其中
v是appdata_base類(lèi)型宇植,v.texcoord就是模型頂點(diǎn)的uv數(shù)據(jù)。
_MainTex是使用的圖片指郁。
name##_ST實(shí)際上就是_MainTex_ST。
name##_ST.xy就是Tiling的xy值闲坎。
name##_ST.zw就是Offset的xy值。
tex2D(_MainTex, i.uv); 對(duì)圖片進(jìn)行采樣 參數(shù)1 是采樣圖片
// Use the refract dir in world space to access the cubemap
fixed3 refraction = texCUBE(_Cubemap, i.worldRefr).rgb * _RefractColor.rgb; 這是一個(gè)立方體的采樣腰懂,
//CG 的refract函數(shù)來(lái)計(jì)算折射方向 參數(shù)1 入射光線方向(必須歸一),2:表現(xiàn)法線,法線方向歸一项秉,3:入射光線所在介質(zhì)的折射率和折射光線所在介質(zhì)的折射率之間的比值
o.worldRefr = refract(-normalize(o.worldViewDir), normalize(o.worldNormal), _RefractRatio);
以上這些函數(shù)都沒(méi)有歸一化
WorldSpaceLightDir、UnityWorldSpaceLightDir 和ObjSpaceLightDir娄蔼,稍微復(fù)雜一些,這是因?yàn)椋?Unity 幫我們處理了不同種類(lèi)光源的情況岁诉。需要注意的是,這3 個(gè)函數(shù)僅可用于前向渲染(關(guān)于什么是前向渲染會(huì)在9.1 節(jié)中講到)涕癣。這是因?yàn)橹挥性谇跋蜾秩緯r(shí),這3 個(gè)函數(shù)里使用的內(nèi)置變量 _WorldSpaceLightPos0 等才會(huì)被正確賦值。
光照 陰影使用的函數(shù)
SHADOW_ COORDS 恬叹、TRANSFER_SHADOW 和SHADOW_ATTENUATION 是計(jì)算陰影時(shí)的“三劍客”。這些內(nèi)置宏幫助我們?cè)诒匾獣r(shí)計(jì)算光源的陰影
在前向渲染中绽昼, 宏SHADOW_COORDS實(shí)際上就是聲明了一個(gè)名為** _ShadowCoord的陰影紋理坐標(biāo)變量唯鸭。而TRANSFER_SHADOW的實(shí)現(xiàn)會(huì)根據(jù)平臺(tái)不同而有所差異硅确。如果當(dāng)前平臺(tái)可以使用屏幕空間的陰影映射技術(shù)(通過(guò)判斷是否定義了UNITY_NO_SCREENSPACE_SHADOWS來(lái)得到) , TRANSFER_SHADOW 會(huì)調(diào)用內(nèi)置的ComputeScreenPos 函數(shù)來(lái)計(jì)算
_ShadowCoord** ;如果該平臺(tái)不支持屏幕空間的陰影映射技術(shù), 就會(huì)使用傳統(tǒng)的陰影映射技術(shù)菱农,TRANSFER_SHADOW 會(huì)把頂點(diǎn)坐標(biāo)從模型空間變換到光源空間后存儲(chǔ)到ShadowCoord 中缭付。然后循未,** SHADOW_ATTENUATION** 負(fù)責(zé)使用ShadowCoord 對(duì)相關(guān)的紋理進(jìn)行采樣,得到陰影信息的妖。
參考:https://blog.csdn.net/laverfever/article/details/23962411
官方 shader API:https://docs.unity3d.com/Manual/SL-BuiltinFunctions.html
https://docs.unity3d.com/ScriptReference/Shader.html
TANGENT_SPACE_ROTATION 宏 相當(dāng)于嵌入如下兩行代碼:
float3 binormal = cross( v.normal, v.tangent.xyz ) * v.tangent.w;
float3x3 rotation = float3x3( v.tangent.xyz, binormal, v.normal );
也就是構(gòu)造出 tangent space 的坐標(biāo)系, 定義轉(zhuǎn)換world space的向量到tangent space的rotation 矩陣嫂粟。
Hidden Shader的
表示是內(nèi)置shader娇未,不能在材質(zhì)球的下拉列表里看到星虹。一般你要覆蓋內(nèi)置shader的時(shí)候才會(huì)這么寫(xiě),一般是覆蓋默認(rèn)地形shader 相關(guān)的 地面 草 廣告牌 等…