1. 程式人生 > >Unity Shader常用函式總結

Unity Shader常用函式總結

  1. 數學函式
    1. Abs(x) :返回輸入引數的絕對值;
    2. Clamp(x,a,b):如果x小於a則返回a;如果x大於b則返回b;
    3. Cross(A,B):返回兩個三元向量的叉積;
    4. degree(x):輸入引數為弧度值(radians),函式將其轉換為角度值;
    5. determinant(m):計算矩陣的行列式因子;
    6. dot(A,B):返回A和B的點積;
    7. exp2(x): 2的x次方;
    8. lerp(a,b,f):插值計算,
    9.  step(a, x):如果 x<a,返回0;否則,返回1。
    10. Saturate(x):將輸入值限制在[0,1]之間
  2. 幾何函式
    1. distance( pt1, pt2)
      :兩點之間的歐幾里德距離(Euclidean distance)
    2.  reflect(I, N):根據入射光方向向量 I,和頂點法向量N,計算反射光方向向量。其中I 和N 必須被歸一化,需要非常注意的是,這個I 是指向頂點的;函式只對三元向量有效;
    3. refract(I,N,eta):計算折射向量,I為入射光線,N為法向量,eta為折射係數;其中 I 和N 必須被歸一化,如果I 和N 之間的夾角太大,則返回(0,0,0),也就是沒有折射光線;I是指向頂點的;函式只對三元向量有效。
  3. 紋理對映函式(投影紋理查詢函式使用計算得到的投影紋理座標,並在使用之前會將該投影紋理座標除以透視值
    1. Tex2D(sampler2D tex, float2 s)
      二維紋理查詢;
    2. Tex2Dproj(sampler2D tex, float3 sq) 二維投影紋理查詢
    3. Tex3D(sampler3D tex, float s)     三維紋理查詢
    4. texCUBE(samplerCUBE tex, float3 s)   查詢立方體紋理
    5. texCUBEproj (samplerCUBE tex, float4 sq) 查詢投影立方體紋理
  4. 偏導函式
    1.  ddx(a):引數 a對應一個畫素位置,返回該畫素值在X 軸上的偏導數
    2. ddy(a):引數 a對應一個畫素位置,返回該畫素值在Y 軸上的偏導數
    3. 函式 ddx ddy
      用於求取相鄰畫素間某屬性的差值;函式 ddx ddy 的輸入引數通常是紋理座標;函式 ddx ddy 返回相鄰畫素鍵的屬性差值;
  5. UnityShader

巨集(通道設定顯示硬體的各種狀態,例如能開啟alpha混合

  • Material{ Material Block }定義一個使用頂點光照管線的材質
  • Lighting On | Off :開啟或關閉頂點光照。開啟燈光之後,頂點光照才會有作用
  • Cull Back | Front | Off:設定多邊形剔除模式,詳細內容後面的文章會講解到。
    • ​​​​​​​ZTest(Less | Greater | LEqual | GEqual |Equal | NotEqual | Always):設定深度測試模式
  • ​​​​​​​ZWrite On | Off  :設定深度寫模式,詳細內容後面的文章會講解到。 
  • ​​​​​​​Fog { Fog Block }:設定霧引數,詳細內容後面的文章會講解到。
  • ​​​​​​​​​​​​​​AlphaTest (Less | Greater | LEqual | GEqual| Equal | NotEqual | Always) CutoffValue:開啟alpha測試
  • ​​​​​​​Blend SourceBlendMode |DestBlendMode :設定alpha混合模式 ​​​​​​​
  • Color Color value:設定當頂點光照關閉時所使用的顏色
  • ​​​​​​​ColorMask RGB | A | 0 | any combination of R, G, B, A:設定顏色寫遮罩。設定為0將關閉所有顏色通道的渲染
  • ​​​​​​​Offset OffsetFactor , OffsetUnits:設定深度偏移
  • ​​​​​​​SeparateSpecular On | Off:開啟或關閉頂點光照相關的平行高光顏色 
  • ColorMaterial AmbientAndDiffuse | Emissio:當計算頂點光照時使用每頂點的顏色

UnityShader內建函式

  1. TRANSFORM_TEX(tex,name)這個方法的定義在UnityCG.cginc中,它有兩個引數,tex.xy是頂點的uv值,name##_ST則是在這個shader所在的材質球中,紋理圖片的縮放和偏移,S指Scale,T指Transform,它是一個float4型別,其值分別為(Tiling.x,Tiling.y,Offset.x,Offset.y)。這個方法運算後,得到的是經過偏移和縮放的uv。它的運算公式是TextureCoordinate = tex.xy * name##_ST.xy + name##_ST.zw。如果偏移為0,縮放為預設1,則可以不用經過這個過程。
  2. UnpackNormal(fixed4 packednormal)對法線紋理進行取樣。以UnpackNormal方法來說,它最主要的也就是packednormal.xyz * 2 – 1,要解釋這個,就必須講到法線紋理的生成。法線紋理是把模型的法線資訊存到圖片中去,每條法線的x,y,z對應的存到每個畫素的r,g,b中。每條法線裡的每個數值都是一個[-1,1]的閉合區間裡,畫素的每個數值則都是在[0,255]中,(n + vec3(1.0,1.0,1.0)) * (255.0 / 2.0),每個法線向量,經過加上 vec3(1.0,1.0,1.0)。變成[0,2]的閉合區間裡,然後除以2,再乘以255,發現向量,就會轉換成了[0,255]裡的數值。這也是上述那條公式的由來。至於法線紋理如何生成,有興趣的可以詳細瞭解一下這個演算法,各個軟體的生成演算法不一樣,最終得到的法線紋理也不一樣。但是紋理裡的資料,肯定是符合規範的法線紋理資料,可以在shader中使用。另外一個方法UnpackNormalDXT5nm ,則是一個壓縮法線紋理後的方法。大家都知道,法線是一個單位向量,也就是它的長度是1,所以只需要知道x,y的數值,是可以計算得到z的數值的,z=1-(x+y)的平方。這樣就可以減少貼

    inline fixed3 UnpackNormal(fixed4 packednormal)

    {

    #if defined(UNITY_NO_DXT5nm)

    return packednormal.xyz * 2 - 1;

    #else

    return UnpackNormalDXT5nm(packednormal);

    #endif

    }

    inline fixed3 UnpackNormalDXT5nm (fixed4 packednormal)

    {

    fixed3 normal;

    normal.xy = packednormal.wy * 2 - 1;

    normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));

    return normal;

    }

    圖的大小,減少GPU的資料傳輸量。
  3. UnityObjectToWorldNormal(float3 normal): 從模型空間到世界空間轉換法線
  4. UnityObjectToWorldDir(float3 dir ): normalize(mul((float3x3)_World2Object)norm); _World2Object:相當於當前世界矩陣的逆矩陣。
  5. Luminance(float3 c):實現shader的灰度化,return dot(c,fixed(0.22,0.707,0.071);