2018年4月17日 星期二

Define base shader architecture

使用Define架構的方式來實作Shader。
好處:
1.Reused(代碼可以重複利用)
2.彈性(可以輕易地組合出不同的shader)
3.效能調效(可以輕易利用define來開關功能)
4.方便除錯(同上)
5.使用者容易理解(看define就知道做了那些事)
缺點:
1.代碼比較複雜(define的地方太多,建議先把代碼寫好測完,之後再考慮怎麼切…)

比較適合應用的例子有Lighting的計算,水系統…等。
以下用目前實作的水系統當作例子:
//========================================================
//一般平面水
Shader "CustomShader/PlaneWater"
{
Properties
{
...
}
SubShader
{
...
LOD 500 //在高階硬體以上的時候使用
Pass
{
...
CGPROGRAM
#pragma vertex WaterSimulateVertexProgram
#pragma fragment WaterSimulateFragmentProgram
#pragma multi_compile_fog
#define PROCESS_FOG //霧氣功能
#define PROCESS_SMALL_NORMAL //小波Normal
#define PROCESS_MEDIUM_NORMAL //中波Normal
#define PROCESS_LARGE_NORMAL //大波Normal
#define PROCESS_DEPTH //深度處理
#define PROCESS_REFRACTION //折射處理
#define PROCESS_REFLECTION //反射處理
#define PROCESS_EDGE_FOAM //水邊緣處理
#define PROCESS_WAVE_FOAM //浪泡沫處理
#include "WaterSimulation.cginc"
ENDCG
}
}
SubShader
{
...
LOD 100 //在低階硬體以上的時候使用
Pass
{
...
CGPROGRAM
#pragma vertex WaterSimulateVertexProgram
#pragma fragment WaterSimulateFragmentProgram
#pragma multi_compile_fog
#define PROCESS_FOG //霧氣功能
#define PROCESS_SMALL_NORMAL //小波Normal
#define PROCESS_LARGE_NORMAL //大波Normal
#include "WaterSimulation.cginc"
ENDCG
}
}
}
//========================================================
//無限大點位移水
Shader "CustomShader/ProjectedGridWater"
{
SubShader
{
...
LOD 500 //在高階硬體以上的時候使用
Pass
{
...
CGPROGRAM
#pragma vertex WaterSimulateVertexProgram
#pragma fragment WaterSimulateFragmentProgram
#pragma multi_compile_fog
#define PROCESS_FOG //霧氣功能
#define PROCESS_SMALL_NORMAL //小波Normal
#define PROCESS_MEDIUM_NORMAL //中波Normal
#define PROCESS_LARGE_NORMAL //大波Normal
#define PROCESS_DEPTH //深度處理
#define PROCESS_REFRACTION //折射處理
#define PROCESS_REFLECTION //反射處理
#define PROCESS_EDGE_FOAM //水邊緣處理
#define PROCESS_WAVE_FOAM //浪泡沫處理
#define PROCESS_PROJECTEDGRID //GPU點位移(高低)處理
#define PROCESS_DECAL //平貼水面特效處理
#include "WaterSimulation.cginc"
ENDCG
}
}
}
//========================================================
//簡單湖泊
Shader "CustomShader/Lake"
{
SubShader
{
...
LOD 100 //在低階硬體以上的時候使用
Pass
{
...
Blend SrcAlpha OneMinusSrcAlpha
ZWrite Off
CGPROGRAM
#pragma vertex WaterSimulateVertexProgram
#pragma fragment WaterSimulateFragmentProgram
#pragma multi_compile_fog
#define PROCESS_FOG //霧氣功能
#define PROCESS_SMALL_NORMAL //小波Normal
#define PROCESS_LARGE_NORMAL //大波Normal
#define PROCESS_CUBEMAP_REFLECTION //Cubeamp反射
#define PROCESS_WITH_VERTEXCOLOR //整合Vertex color
#include "WaterSimulation.cginc"
ENDCG
}
}
}

以下視頻是在S8的結果,S7之前測過的效能也還蠻OK的…


Dream continues in...

沒有留言:

張貼留言