(1) 表面着色器和紋理映射
下面這個 圖 呢 是我們 unity3d Shader 的 一個 工作流程圖
大體流程:
- 逐定點修改器 用於模型頂點的修改操作(如果沒有需要的話可以直接下一個步驟);頂點修改器的 輸出參數 是我們的 表面着色器的 輸入參數,( Input ) 如果沒有修改就是 原樣輸出
- 表面(函數)着色器 經過一系列 需要的計算, 將結果輸入到 SurfaceOutput 中 做爲 光照模型的 傳入參數
- 光照模型 使用表面函數 輸入的信息 以及場景中的 光源信息 結合 (物理計算) 最後到的 像素點的顏色信息
其中 Input SurfaceOutput 這兩個結構體 分別是
- Input 表 面函數輸入 結構體
- SurfaceOutput 表 面函數輸出 結構體
後面的 章節 也就是圍繞這個五個 部分 進行詳細的講解
漫反射着色原理:
一個標準的 漫反射shader
Shader "Custom/chapter02/CustomDiffuse"
{
Properties
{
_Color ("Color", Color) = (1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" } //渲染類型爲不透明
LOD 200
CGPROGRAM //*****渲染隊 開始 標記
//第一個 編譯器指令 指定了用到的表面函數 以及 光照模型 還有其他的 渲染設置
//-surface surf
//指定當前表面 處理函數爲 surf
//-Standard
//使用的是標準的 光照模型 unity 爲我們提供的 一個標準光照模型資源 ;這裏也可以自定義光照模型
//-fullforwardshadows
//使用的陰影效果
#pragma surface surf Standard fullforwardshadows
//第二個 編譯器指令 指定了 使用的 shader 模型版本爲 3.0
#pragma target 3.0
// 表面函數的 輸入結構體 (應爲Unity shader 輸入結構體 不能爲 空,所以即使沒有 貼圖 這裏也不能爲 空)
struct Input
{
float2 uv_MainTex;
};
//爲屬性值 關聯的變量
fixed4 _Color;
UNITY_INSTANCING_BUFFER_START(Props)
UNITY_INSTANCING_BUFFER_END(Props)
//表面處理函數
//--Input IN
//表面輸入結構體
//
//--inout SurfaceOutputStandard
//標準表面輸出結構體; 填充完畢之後 就會返回到 標準光照模型 standard 裏面進行光照計算 最終會到的像素值
void surf (Input IN, inout SurfaceOutputStandard o)
{
fixed4 c = _Color;
o.Albedo = c.rgb;
}
ENDCG //*****渲染隊 結束 標記
}
FallBack "Diffuse"
}
設置光照模型 爲 蘭伯特光照模型 lambert, 相對於 標準光照模型 SurfaceOutput; lambert 更簡單 運算更快 修改兩個地方就可以
#pragma surface surf Lambert fullforwardshadows
void surf (Input IN, inout SurfaceOutput o)
{
fixed4 c = _Color;
o.Albedo = c.rgb;
}
//Lambert 光照的模型 需要對應的 表面函數 輸出結構體
壓縮 數組 壓縮矩陣:
Unity Shader 重要 數據類型 壓縮 數組; CG 裏面有兩種數據類型
- 單值 : float int
- 壓縮數組 : float3 int4
- 壓縮矩陣 : float4*4(4*4的 float 矩陣)
壓縮數組 可以拆分:
float3 ==> {x, y, z} || {r, g, b}
float4 ==> {x, y, z,w} || {r, g, b,a}
壓縮數組的
● 混寫:swizzling
--CG o.Albdeo = _Color.rgb --C# 示例 非真實 CG 代碼 o.Albdeo.r = _Color.r o.Albdeo.g = _Color.g o.Albdeo.b = _Color.b
調換 RGB 通道 值
_Color.brg //就能達到 調換 R 通道 和 B 通道的值
● 塗抹:smearing
單值 賦給 壓縮數字; 壓縮數組的各個 分量 均被 賦值
o.Albedo = 0 //(0,0,0)
● 遮罩:masking 只對 壓縮數組 指定分量 進行賦值
o.Albedo.rg = _Color.rg
● 壓縮矩陣
float4*4 matrix; // 4*4 壓縮矩陣 //... .. . float first = matrix._m00; // 得到第一行 第一列的 數據 float last = matrix._m33; // 得到第三行 第三列的 數據 _mrc float4 diagonal = matrix._m00_m11_m22_m33 //連式獲取 對角線矩陣數據 float4 firstRow = matrix[0] //獲取矩陣 第一行數據 float4 firstRow1= matrix._m00_m01_m02_m03 //獲取矩陣 第一行數據 (連式方式)