寫在前面,終于開始學習這神奇的東東。
OpenGL與DirectX都是渲染的一個工具。shader可以認為一種渲染命令,由OpenGL或者DirectX解析。
使用的Shader Lab語言來編寫shader
分為兩種類型shader表面著色器和頂點/片元著色器
下面是所有Shader的屬性類型設置及一些標志的使用方法,同時也可以看到整個shader的基本結構如此。
Shader"BanMing/FirstShader"{//這里設置shader在material的選項的位置,這里的名字可以跟文件不同
Properties{
//公共屬性可調節的
//屬性名(“外部顯示屬性名”,類型)=初始化值
_Color("Color",Color)=(1,1,1,1)
_Vector("Vector",Vector)=(0,0,0,0)
_Int("Int",Int)=1
_Float("Float",Float)=1.5
_Range("Range",Range(1,11))=7
_Texture("Texture", 2D) = "white" { }
_Cube("Cube",Cube) = "white" {}//天空盒子
_3D("3D",3D) = "white" {}
//下拉菜單
[KeywordEnum(None, Add, Multiply)] _Overlay("Overlay mode", Float) = 0
//選擇
[Toggle] _Invert("Invert color?", Float) = 0
[Toggle(ENABLE_FANCY)] _Fancy("Fancy?", Float) = 0
[Enum(MyEnum)] _Blend("Blend mode", Float) = 1
[Enum(One,1,SrcAlpha,5] _Blend2("Blend mode subset", Float) = 1
[HideInInspector]
_Color("Main Color", Color) = (1,0.5,0.5,1)
_WaveScale("Wave scale", Range(0.02,0.15)) = 0.07 // sliders
}
//可以很多個,可以在不同的顯卡上運行
SubShader{
//必須有一個Pass塊 其中是編寫方法
Pass{
//這里必須需要注明使用什么語言編寫
CGPROGRAM
//這里定義屬性,4個值的屬性就使用float4,1個的就使用float,貼圖就是使用sampler2D
float4 _Color;
float4 _Vector;
float _Int;
float Range;
sampler2D _Texture;
samplerCube _Cube;
sampler3D _3D;
//用float的地方都可以使用fixed與half代替,他們的區別就是范圍。
//float 32位 一般用于位置信息存儲
//half 16位 -6萬~6萬
//fixed 11位 -2~2 一般用于顏色信息存儲
ENDCG
}
}
//當上面的所有shader效果當前顯卡都不支持,就選擇下面這個
fallback "Diffuse"
}
Properties { Property [Property ...] }
定義屬性塊,其中可包含多個屬性,其定義如下:
name ("display name", Range (min, max)) =number
定義浮點數屬性,在檢視器中可通過一個標注最大最小值的滑條來修改。
name ("display name", Color) =(number,number,number,number)
定義顏色屬性
name ("display name", 2D) = "name" {options }
定義2D紋理屬性
name ("display name", Rect) = "name"{ options }
定義長方形(非2次方)紋理屬性
name ("display name", Cube) = "name"{ options }
定義立方貼圖紋理屬性
name ("display name", Float) = number
定義浮點數屬性
name ("display name", Vector) =(number,number,number,number)
定義一個四元素的容器(相當于Vector4)屬性