3一個簡單的Shader

格式

一個簡單的UnityShader看起來是這樣:
頂點片元着色器
CG代碼段 : 由CGPROGRAMENDCG包圍起來
編譯指令 這裏的用來告訴Unity, 什麼是頂點着色器,什麼是片元着色器

#pragma vertex 頂點着色器函數名
#pragma fragment 片元着色器的函數名

模型數據怎麼進入Shader的?

在調用DrawCall的時候, MeshRender組件會把它負責渲染的模型數據 傳給 UnityShader

屬性

在CG代碼中, 聲明一個與 Properties 下 同名,同類型 的變量即可.
也可以看作, Properties 中的語句是 對CG代碼中的同名變量做了一個初始化
類型對應關係如下:
類型對應關係

語義

爲輸入變量指定從什麼 地方拿數據, 或者爲輸出變量指定往什麼地方輸出數據.
一般的語義 是沒有特別含義的, 存儲什麼都可以
系統數值語義 會存儲渲染流水線中用的的變量, 不可以隨便用
Unity支持的有特殊含義的語義 Unity會用的變量, 不可以隨便用,如下:
Unity特殊語義

包含文件

.cginc 結尾. 在CG代碼段中如下進行包含:

#include "名字"

UnityCG.cginc : 有一些常用的結構, 函數, 宏.
UnityShaderVariables.cginc : 自動包含, 有前面說過的全局變量

Debug

  • Visual Studio 插件 Graphic Debugger
  • Unity 窗口 Frame Debugger

建議

  • float > half > fixed(-2到+2之間). 儘量用低精度
  • 減少Shader中的計算量, 不然寄存器可能會不夠
  • 通過修改 Shader Target 可以假設有更多的寄存器可用. OpenGL平臺當作支持3.0, WP8/WinRT 平臺 只支持 2.0Shader Target
  • 慎用分支和循環, 《GPU精粹2》 GPU流程控制 一章講了更多
  • 不要除以0
發佈了29 篇原創文章 · 獲贊 4 · 訪問量 8454
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章