[Unity Shader] 常用的數值類型和語義


  書看到第八章,跟隨寫了一些例子,但有些數值類型的使用還是需要特別注意,經常需要查閱,在這里做一下總結。

 

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 
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM