1. 程式人生 > 實用技巧 >Shader筆記——初識

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);

Shader的語言       

  1. 基於DirectX的High Level Shading Language,簡稱HLSL。
  2. 基於OpenGL的OpenGL Shading Language,簡稱GLSL。
  3. 還有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:偏移因子,設定深度偏移

Writing...