書看到第八章,跟隨寫了一些例子,但有些數值類型的使用還是需要特別注意,經常需要查閱,在這里做一下總結。
1 ShaderLab屬性類型和Cg變量類型的匹配關系
Color、Vector:float4,half4,fixed4
Range、Float:float, half, fixed
2D:sampler2D
3D:sampler3D
Cube:samplerCube
Int:int(32位整型數據)
注意:這些屬性類型是在定義屬性時使用,例如:
1 Shader "Unlit/Test Shader" 2 { 3 Properties 4 { 5 _Color ("Color Tint", Color) = (1, 1, 1, 1) 6 _MainTex ("Main Tex", 2D) = "white" {} 7 _BumpMap ("Normal Map", 2D) = "bump" {} 8 _BumpScale ("Bump Scale", Float) = 1.0 9 _SpecularMask ("Specular Mask", 2D) = "white" {} 10 _SpecularScale ("Specular Scale", Float) = 1.0 11 _Specular ("Specular", Color) = (1, 1, 1, 1) 12 _Gloss ("Gloss", Range (8.0, 256.0)) = 20.0 13 } 14 SubShader{
15 Pass{
16 ......
17 } 18 }
2 Cg/HLSL常用的3種精度的數值類型
float: 32位存儲,用在坐標、未歸一化的矢量、uv、一些調整參數
half:16位存儲,范圍 -60000~60000
fixed:11位存儲,范圍-2.0~2.0,用於存儲顏色、歸一化后的矢量、在這個范圍內的參數等
注意:uv不能用fixed存儲,因為可能通過貼圖的Tiling和Offset讓其范圍超過[0, 1]
1 fixed4 _Color; 2 sampler2D _MainTex; 3 float4 _MainTex_ST; 4 sampler2D _BumpMap; 5 float _BumpScale; 6 sampler2D _SpecularMask; 7 float _SpecularScale; 8 fixed4 _Specular; 9 float _Gloss; 10 11 struct a2v 12 { 13 float4 vertex : POSITION; 14 float3 normal : NORMAL; 15 float4 tangent : TANGENT; 16 float4 texcoord : TEXCOORD0; 17 }; 18 19 struct v2f 20 { 21 float4 pos : SV_POSITION; 22 float2 uv : TEXCOORD0; 23 float3 lightDir : TEXCOORD1; 24 float3 viewDir : TEXCOORD2; 25 }; 26 27 v2f vert (a2v v) 28 { 29 v2f o; 30 ...... 31 return o; 32 } 33 34 fixed4 frag (v2f i) : SV_Target 35 { 36 ...... 37 return fixed4(ambient + diffuse + specular, 1.0); 38 }
3 Unity Shader常用語義(寄存器)
就是上面這段代碼中的標紅部分。它代表了前面那個變量從哪里獲得數據或者存儲到哪里。
3.1 從應用階段傳遞模型數據給頂點着色器時:
POSITION:模型空間中的頂點位置,通常是float4類型
NORMAL:頂點法線,通常是float3類型
TANGENT:頂點切線,通常是float4類型,第四個分量用於存儲特殊數值
TEXCOORDn:頂點紋理坐標,通常是float2或float4類型。在Unity Model2和3中,n=8(Unity默認),在4和5中n=16.
COLOR:頂點顏色,通常是fixed4或float4類型
3.2 從頂點着色器傳遞給片元着色器時:
SV_POSITION:裁剪空間中的頂點坐標,結構體中必須包含一個用該語義的變量
COLOR0:輸出第一組頂點顏色,不必需
COLOR1:輸出第二組頂點顏色,不必需
TEXCOORD0~7:輸出紋理坐標,不必需
3.3 片元着色器輸出:
SV_Target: 輸出值將會存儲到渲染目標(render target)中
注意:一個語義可以使用的寄存器最多只能處理4個浮點值(float),因此對於4x4矩陣,需要拆分成4個float4類型的變量來存儲矩陣數據
4 Unity Shader常用函數
float3 WorldSpaceViewDir(float4 v) //輸入一個模型空間中的頂點位置,返回世界空間中從該點到攝像機的觀察方向 float3 ObjSpaceViewDir(float4 v) //輸入一個模型空間中的頂點位置,返回模型空間中從該點到攝像機的觀察方向 float3 WorldSpaceLightDir(float4 v) //僅用於前向渲染中(ForwardBase),輸入一個模型空間中的頂點位置,返回世界空間中從該點到光源的光照方向,沒有被歸一化 float3 UnityWorldSpaceLightDir(float4 v) //僅可用於前向渲染中,輸入一個世界空間的頂點位置,返回世界空間從該點到光源的光照方向,沒有被歸一化 float3 ObjSpaceLightDir(float4 v) //僅用於前向渲染中(ForwardBase),輸入一個模型空間中的頂點位置,返回模型空間中從該點到光源的光照方向,沒有被歸一化 float3 UnityObjectToWorldNormal(float3 norm) //把法線從模型空間轉換到世界空間中 float3 UnityObjectToWorldDir(in float3 dir) //把方向矢量從模型空間轉換到世界空間中 float3 UnityWorldToObjectDir(float3 dir) //把方向矢量從世界空間轉換到模型空間中 float3 Shade4PointLights(...) //僅可用於前向渲染中,計算四個點光源的光照,它的參數是已經打包進矢量的光照數據。前向渲染通常會使用這個函數來計算逐頂點光照 --------------------- 作者:honey199396 來源:CSDN 原文:https://blog.csdn.net/honey199396/article/details/54574254 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
5 Unity Shader 變量
UNITY_MATRIX_MVP //當前的模型*觀察*投影矩陣,用於將頂點/方向矢量從模型空間轉換到裁剪空間 UNITY_MATRIX_MV //當前的模型*觀察矩陣,用於將頂點/方向矢量從模型空間轉換到觀察空間 UNITY_MATRIX_V //當前的觀察矩陣,用於將頂點/方向矢量從世界空間轉換到觀察空間 UNITY_MATRIX_P //當前的投影矩陣,用於將頂點/方向矢量從觀察空間轉換到裁剪空間 UNITY_MATRIX_VP //當前的觀察*投影矩陣,用於將頂點/方向矢量從世界空間轉換到裁剪空間 UNITY_MATRIX_T_MV //UNITY_MATRIX_MV的轉置矩陣 UNITY_MATRIX_IT_MV //UNITY_MATRIX_MV的逆轉置矩陣,用於將發現從模型空間轉換到觀察空間,也可以用於得到UNITY_MATRIX_MV的逆矩陣 unity_ObjectToWorld(_Object2World) //當前的模型矩陣,用於將頂點/方向矢量從模型空間變換到世界空間 unity_WorldToObject(_World2Object) //用於將頂點/方向矢量從世界空間轉換到模型空間 --------------------- 作者:honey199396 來源:CSDN 原文:https://blog.csdn.net/honey199396/article/details/54574254 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
6 Unity Shader 攝像機和屏幕參數
//該攝像機在世界空間中的位置 float3 _WorldSpaceCameraPos //x=1.0(或-1.0,如果正在使用一個翻轉的投影矩陣進行渲染),y=Near,z=Far,w=1.0+1.0/Far,其中Near和Far分別是近裁剪平面和遠裁剪平面到攝像機的距離 float4 _ProjectionParams //x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height,其中width和height分別是該攝像機的渲染目標(render target)的像素寬度和高度 float4 _ScreenParams //x=1-Far/Near,y=Far/Near,z=x/Far,w=y/Far,該變量用於線性化Z緩存中的深度值 float4 _ZBufferParams //x=width,y=height,z沒有定義,w=1.0(該攝像機是正交攝像機)或w=0.0(該攝像機是透視攝像機),其中width和height是正交投影攝像機的寬度和高度 float4 unity_OrthoParams //該攝像機的投影矩陣 float4x4 unity_CameraProjection //該攝像機的投影矩陣的逆矩陣 float4x4 unity_CameraInvProjection //該攝像機的6個裁剪平面在世界空間下的等式,按左、右、下、上、近、遠裁剪平面 float4 unity_CameraWorldClipPlanes[6] --------------------- 作者:honey199396 來源:CSDN 原文:https://blog.csdn.net/honey199396/article/details/54574254 版權聲明:本文為博主原創文章,轉載請附上博文鏈接!