Shader筆記——初識
宣告:本文僅供自己記錄學習使用
Shader其實就是專門用來渲染圖形的一種技術,通過shader,我們可以自定義顯示卡渲染畫面的演算法,使畫面達到我們想要的效果。
GPU,CPU,顯示卡驅動,Directx,OpenGL,shader(無序排列)。這些都是圖形渲染相關。
從unity的基礎上來講,一個模型,首先會在硬碟中載入到記憶體中,然後CPU讀取,並且告訴GPU想要渲染成什麼效果,而GPU收到CPU的指令進行渲染,而渲染的過程
上圖中,在渲染時,我們可以對其中一些步驟進行編輯,按照自己的需求(改變頂點,改UV)等,cg語言編寫控制,最終達到想要的效果。
而我們的主角shader並不是直接能被識別的,他在unity中編譯成可識別的程式,我們可以稱之為ShaderLab
Shader的兩種型別
- 頂點shader,對三角形面片的頂點操作,計算每個三角面片上的頂點,併為最終畫素渲染做準備
- 以畫素為單位,計算光照、顏色的一系列演算法。
- DirectX中
- 頂點shader叫做 Vertex Shader
- 畫素Shader叫做 Pixel Shader
- OpenGL
- 頂點Shader也叫做 Vertex Shader
- 畫素Shader叫做 Fragment Shader(片斷Shader或者片元Shader);
- DirectX中
Shader的語言
- 基於DirectX的High Level Shading Language,簡稱HLSL。
- 基於OpenGL的OpenGL Shading Language,簡稱GLSL。
- 還有NVIDIA公司的C for Graphic,簡稱Cg語言。
在pc端,基本上使用的DirectX,而在android和ios,linux則使用的OpenGL
而unity作為跨平臺的編輯器,無疑選擇Cg語言
在unity中有三種shader:
- Surface Shaders 表面著色器
- Vertex/Fragment Shaders 頂點/片斷著色器
- Fixed Function Shaders 固定管線著色器
下面是乾貨
ShaderLab語法基礎
1.定義一個Shader,每一個著色程式都要有一個shader Shader“name” { //name:shader的名字 //定義的一些屬性,定義在這裡會在屬性檢視器顯示 [Propertes] //子著色器列表,一個shader至少有一個子著色器 Subshaders{...} //如果子著色器顯示卡不支援,就會降級處理,Fallback [Fallback] }
Propertes屬性
2.Propertes定義 name("displayname",type)=值 name指屬性的名字,Unity中使用下劃線開始 _xxx displayname,在屬性檢查器顯示的名字 type這個屬性的型別 值,預設值 3.型別 Float, Int, Color(r,g,b,a)(0~1), Vector(4維向量), Range(start,end), 2D:2D紋理 Rect:矩形紋理屬性 Cube:立方體紋理屬性 3D:3D紋理屬性 例:name("displayname",2D)="name"{options} 4.Options:紋理屬性選項 TexGen:紋理生成模式,紋理自動生成紋理座標的模式,頂點shader自動忽略 ObjectLinear,EyeLinear,SphereMap,CubeReflect CubeNormal LightmapMod:光照貼圖模式如果設定,紋理會被渲染器的光線貼圖影響
5.prepertes定義案例
_Range("range value",Range(0,1))=0.3;//定義一個範圍值
_Color("color",Color(1,1,1,1))=(1,1,1,1);//定義一個顏色
_FloatValue("float value",Float)=1;定義一個浮點
_MainTex("Altobo",Cube)="skybox"{TexGen CubeReflect}//定義一個立方貼圖紋理屬性
SubShader
組成:SubShader{[Tags],[CommonState],Pass{}}
子著色器由 標籤+通用狀態+渲染通道並可選為所有通道初始化的通用狀態
渲染的時候將優先渲染一個被每個通道所定義的物件
通道的型別:
- RegularPass
- UserPass
- GrabPass
在通道中定義狀態同時對整個子著色器可見,所有通道可以共享狀態
SubShader { Tags{"Queue","Transparent"} Pass{ Lighting Off //關閉光照
... } }
Tags
Tags{"key1"="value1" "key2"="value2" "key3"="value3"}//空格隔開
Tags型別
- Queue tag佇列標籤
- RenderType tag渲染型別標籤
- DisableBatching tag禁用批處理標籤
- ForceNoShadowCasting tag強制不投影標籤
- IngoreProjecttor忽略投影標籤
- CanUseSpriteAtlas tag使用精靈圖集標籤
- PreviewType tag預覽型別標籤
Pass
SubShader包裝了自定義的渲染方案,由一個個通道(Pass)執行,一個SubShader可以包含多個通道,每個通道都渲染一次
Pass基本寫法 Pass{[Name and Tags][RenderSetup][TextureSetup]}
Pass塊的Name引用此Pass,可以在其他著色器的Pass塊中引用他,減少重複,Name命令必須大寫
RegularPass設定
- Linghting:光照開啟/關閉定點光照 On/Off
- Material:(材質)定義一個使用定點光照管線的材質
- ColorMaterial:顏色集:計算使用定點光照使用頂點顏色
- SeparateSpecular:開光狀態:開啟或關閉頂點光照相關的鏡面高光顏色 On/Off
- Color:設定定點光照關閉時使用的顏色
- Fog:設定霧引數
- AlphaTest:Alpha測試
- ZTest:深度測試模式
- ZWrite:深度寫模式
- Blend:混合模式SourceBlendMode,DestBlendMode,AlphaSourceBlendMode,AlphaDestBlendMode
- ColorMask:顏色遮罩,顏色值可以由RGB或A或0或R,G,B,A的組合,設定為0,關閉所有顏色通道渲染
- Offset:偏移因子,設定深度偏移