一、固定功能着色器(Fixed Function Shader)
固定功能着色器為固定功能渲染管線的具體表現。功能較簡單兼容比較老的機器
二、表面着色器
存在於Unity3D中由U3D發揚光大的一門技術。Untiy3D為我們把Shader的復雜性包裝起來,降低shader的書寫門檻,創建了表面着色器
三、頂點着色器和片段着色器
GPU上含有兩個組件:可編程頂點處理器和可編程片段處理器,頂點和片段處理器被分離成可編程單元,可編程頂點處理器是一個硬件單元,可以運行頂點程序,而可編程片段處理器則是一個可以運行片段程序的單元。頂點着色器:頂點着色程序從GPU前端(寄存器)中提取圖元信息(頂點位置、法向量、紋理坐標),並完成頂點坐標空間變換、法向量空間轉換、光照計算等操作,最后將計算數據傳送到指定寄存器中。片段着色器片段程序從上述寄存器中獲取需要的數據:紋理坐標與光照信息等,並根據這些信息以及從應用程序傳遞的紋理信息進行每個片段的顏色計算(紋理查詢),最后將處理后的數據傳送光柵操作模塊。
三種着色器的共同點:
都必須從唯一一個根Shader開始
Prooerties參數部分,作用以及語法完全相同。
具體功能都在SubShader里。
都可以打標簽
都可以Fallback
都可以處理基本的功能,例如光照漫反射以及鏡面反射。但如uv計算效果等高級功能,固定功能着色器無法完成。
三種着色器的不同點
表面着色器沒有通道pass{},加了會報錯,該着色器已經把具體內容打包在光照模型中了。
固定渲染管線每句代碼之后都沒有“;”
核心結構不同:
固定渲染管線的核心是:
頂點與片段着色器的核心是:
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
ENDCG
表面着色器的核心是:
CGPROGRAM
#Pragma surface surf Lambert
ENDCF
2.這套表示使用的是自己寫的光照模型lsyLightModel,並且使用了頂點處理函數vert
CGPROGRAM
#pragma surface surf lsyLightModel vertex:vert
ENDCG

1、從這幅圖可以看到,Unity中的shader可以分為以下三個模塊:
屬性可以划分為以下幾類:
1)、數字與滑動條
name ("display name", Range (min, max)) = number //滑動條調節
name ("display name", Float) = number//數字調節
name ("display name", Int) = number//數字調節
顏色與向量(注意是四元數)
name ("display name", Color) = (number,number,number,number)
name ("display name", Vector) = (number,number,number,number)
2)、貼圖
name ("display name", 2D) = "defaulttexture" {}
name ("display name", Cube) = "defaulttexture" {}//立方體貼圖
name ("display name", 3D) = "defaulttexture" {}
3)、細節
Range與float的屬性只能是單精度值。
在后面的着色器程序中,屬性值通過[name]來訪問。而display name將顯示在材質檢視器中。
可以使用在屬性定義加上等號為每個屬性提供缺省值。
對於紋理(2D, Rect, Cube) 缺省值既可以是一個空字符串也可以是某個內置的缺省紋理:"white", "black", "gray" or"bump"
使用示例
// properties for a water shader
Properties
{
_WaveScale ("Wave scale", Range (0.02,0.15)) = 0.07 // sliders
_ReflDistort ("Reflection distort", Range (0,1.5)) = 0.5
_RefrDistort ("Refraction distort", Range (0,1.5)) = 0.4
_RefrColor ("Refraction color", Color) = (.34, .85, .92, 1) // color
_ReflectionTex ("Environment Reflection", 2D) = "" {} // textures
_RefractionTex ("Environment Refraction", 2D) = "" {}
_Fresnel ("Fresnel (A) ", 2D) = "" {}
_BumpMap ("Bumpmap (RGB) ", 2D) = "" {}
}
2、子着色器SubShader
3、回滾FallBack
Shader基本框架的最后是指定一個回滾函數Fallback,用來處理所有的子着色器都不能運行時的情況(當目標設備太老時,所有的設備都有其不支持的特性時使用了Fallback),可以認為是一種defult。