学习ShaderLab 基础归纳
一、Shader种类
1,表面着色器 Surfance Shader
2,顶点和片元着色器 Vertex and Fragment Shader
3,固定功能着色器 Fixed Shader
二、属性类型
Range(min,max) 滑动条 float
Color 颜色float4 白色(1,1,1,1)
2D 纹理贴图 sampler2D
Rect 矩形纹理 samplerRECT directX暂不支持
Cube 立方贴图纹理 samplerCUBE
Float 浮点数 float
Vector 四维向量 float4
三、通道Pass{[Name and Tags][RenderStup][TextureStep]}
每个Pass{}都能使几何体对象被渲染一次
Pass 名字字母必须大写
Pass{
Name "MyPass"
Material{
}
Lighting On
SetTexture[_]{ combine primary}
}
插入某一通道
SubShader{
UsePass "ShaderName/ MyPass"
}
特殊的pass
GrabPass{“纹理名”}捕获物体位置的屏幕内容到一个纹理中 ,这个纹理供后面通道使用
SetTexture[纹理名]{纹理块}必须放在通道末尾
四、 子着色器SubShader{[Tags][CommonState]Pass{}}
每个Shader 可以包含多个SubShader
显卡会运行第一个能运行的SubShader
1.Tags{"标签1"=“值1”“标签2”=“值2”}
系统定义标签 :
1.1,Queue---渲染队列标签
值:
Background 最先渲染 用于天空盒之类对象
Geometry 默认队列 用于不透明的几何体
Transparent 透明,在默认队列之后渲染,用于玻璃 粒子
Overlay 覆盖,用于叠加效果 用于任何需要最后渲染的对象 如镜头光晕
1.2,IgnoreProjector 忽略投影标签 对半透明物体最有用
值:True 忽略投影 不接受阴影
2.Fallback SubShader后面使用
2.1 Fallback "着色器名"
降级退回给定着色器
2.2 Fallback Off
不降级不警告,甚至没任何SubShader运行
3.Category 分类 拥有相同渲染状态的SubShader放在一起
Shader "example" {
Category {
Fog { Mode Off }
Blend One One
SubShader {
// ...
}
SubShader {
// ...
}
// ...
}
}
五、颜色、材质、光照
Material{
Diffuse[float4] 漫反射颜色
Ambient[float4] 环境光颜色
Specular[float4] 镜面高光颜色
Shininess[float] 加亮时的光泽度
Emission[float4] 自发光颜色
}
Lighting On 开启光照
SeparateSpecular On 开启高光 (光照下才有用)
SetTexture[纹理]{
combine primary 纹理合并方式
}
六、剪裁、深度测试、透明度测试
1.剪裁Cull
Cull Back,Front,Off 不显示背面,不显示前面 ,都显示
2.深度测试
2.1 ZWrite On,Off 绘制固定物体,半透明物体
2.2 Ztest 默认LEqual(依据对象距离绘制对象,隐藏小于设置值的对象)
2.2 Offset 因子,单位 --因子设置z关于x或y的最大斜率,单位 最小分辨深度缓冲值,用于深度太接近产生深度冲突
3.AlphaTest
1.AlphaTest Off渲染所有对象 AlphaTest On开启透明度测试
2.AlphaTest比较模式 Greater 大于 GEqual 大于等于 Less小于 LEqual小于等于 Equal等于 NotEqual 不等于 Always=Off渲染所有 Never 不渲染
七、混合 Blend 用于制作透明物体
1.Blend Off关闭混合
2. Blend 源 目标
3.BlendOp 命令 对加入的颜色操作 Min,Max,Sub,RevSub
八、绑定通道BindChannels{"数据源",目标硬件}
Vertex ---vertex 顶点位置
Normal---顶点法线
Tangent--顶点切线
Texcoord--主要UV坐标
Texcoord1--次要要UV坐标
Color--每个顶点颜色
九、表面着色器
1.声明#pragma surface surf 光照模式[可选参数]
void surf(Input IN,inout SurfanceOutput o){}
光照模式内置Lambert 漫反射 BlinnPhong高光 自定义需要自己实现 Lighting+自定义名的方法
2 .完整的SurfanceOutput 结构
struct SurfanceOutput {
half3 Albedo; 漫反射颜色
half3 Normal; 法线
half3 Emission; 自发光
half Specular; 镜面高光
half Gloss; 光泽度
half Alpha; 透明度
};
3.Input 附加值
包涵纹理的uv信息,IN.uv纹理名
float3 viewDir 视图方向 用于计算视差、边缘光照等效果
float4 screenPos屏幕坐标
float3 worldPos 世界坐标
float3 worldRelf 世界空间的反射向量
float3 worldNormal 世界空间法向量
写入o.Normal参数将包含
内置数据 INTERNAL_DATA
4.常用函数
clip();切割抛弃像素
UnpackNormal();计算法线
十、顶点和片元着色器
1.#pragma vertex vert声明顶点函数
#pragma fragment frag声明片元函数
#pragma taget 3.0 声明目标编译 default=2.0 3.0vert和frag必须同时存在
2.appdata_base包含顶点位置,法线,纹理坐标
appdata_tan包含顶点位置,切线,法线,纹理坐标
3.顶点成员
float4 vertex 顶点位置
float3 normal 顶点法线
float4 textcoord 第一uv坐标
float4 textcood1 第二uv坐标
float4 tangent 切线向量
float4 color 每个顶点颜色