Unity ShaderLab 是渲染抽象层;
具体结构:
Shader "ShaderName" {
Properties{
属性
}
SubShader{
//显卡A使用的子着色器
}
SubShader{
//显卡B使用的子着色器
}
Fallback"VertexLit"
}
命名:Shader "Custom/GameNose"
1.属性Properties{:
2.SubShader:
SubShader
{
Tags{ "RenderType" = "Opaque"}
}
(这里提到了一个Projector,找到了一个有趣的用法:http://www.dreamfairy.cn/blog/2018/11/19/unity-projector-opmize/)
Pass语块
Pass{
[Name]
[Tags]
[Render]
这里的Pass指的是渲染通道(渲染通道在unity Shader中就是SubShader中的Pass。之前的shader中都只有一个Pass,也就是单通道渲染,这样的话如果要对同一个RenderTexture在不同的时刻进行不同的渲染效果输出就需要不停的更换shader。当然,也可以使用多重渲染,但是如果一次只用一个效果,用多重渲染则有些浪费。这个时候就需要多通道渲染。多通道渲染就是在一个shader中有多个Pass,玩家可以根据需求设定通过哪个Pass来进行渲染,从而实现在不同的时候对使用同一个shader对同一个对象进行不同的效果处理。)
这里要注意U3D会将Pass名字转换为大写字母的模式
UsePass; GrabPass:负责抓取屏幕并将结果存储在一张纹理中,
——————————————————————————————————————————
Fallback 指令: 一般在SubShader后写,SubShader指令无法在显卡上运行时候 Fallback"name" or Fallback Off
3.4.1表面着色器(Surface Shader):
当给U3D提供一个表面着色器的时候,它在背后仍然转换成对应的 顶点/片元着色器
就相当于 UNITY 为用户处理了许多光照细节;
SubShader{
Tags { "RaenderType" = "Opaque"}
CGPROGRAM //nvidia cg
#pragma surface surf Lambert
struct Input {
float4 color : COLOR;
};
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = 1'
}
ENDCG
}
Fallback"Diffues"
}
表面着色器写在CGPROGRAM 和 ENGCG 之间 是用CG/HLSL编写的
3.4.3 固定函数着色器略【P35】
着色器的选择:
1、一般使用 表面着色器 或 顶点/片元着色器
2、光源效果 使用 表面着色器
3、光照较少,比如只有一个平行光 或 多 自定义渲染效果 使用 顶点/片元着色器
4、固定函数一般用于老旧设备