格式
一個簡單的UnityShader看起來是這樣:
CG代碼段 : 由CGPROGRAM
與ENDCG
包圍起來
編譯指令 這裏的用來告訴Unity, 什麼是頂點着色器,什麼是片元着色器
#pragma vertex 頂點着色器函數名
#pragma fragment 片元着色器的函數名
模型數據怎麼進入Shader的?
在調用DrawCall的時候, MeshRender組件會把它負責渲染的模型數據 傳給 UnityShader
屬性
在CG代碼中, 聲明一個與 Properties 下 同名,同類型 的變量即可.
也可以看作, Properties 中的語句是 對CG代碼中的同名變量做了一個初始化
類型對應關係如下:
語義
爲輸入變量指定從什麼 地方拿數據, 或者爲輸出變量指定往什麼地方輸出數據.
一般的語義 是沒有特別含義的, 存儲什麼都可以
系統數值語義 會存儲渲染流水線中用的的變量, 不可以隨便用
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.0
- 慎用分支和循環, 《GPU精粹2》 GPU流程控制 一章講了更多
- 不要除以0