写在前面,终于开始学习这神奇的东东。
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)属性