键值对,都是字符串类型,包括以下类型:
Pass语义块:
结构:
1
2
3
4
5
6
Pass{
[Name] //定义Pass名称 "MyPassName"
[Tages]
[RenderSetup]
//other code
}
定义名称后可以通过 UsePass “MyShader/MYPASSNAME”来实现复用,使用其他Unity Shader中的Pass(自动转为大写)。
Pass中的Tages类型:
其他的Pass: UsePass(复用),GrabPass(抓取屏幕存在纹理中用于后续Pass处理)
Fallback
其他的SubShader都无法运行情况下使用
结构:
Fallback “names”
Fallback Off
Unity Shader着色器
着色器代码可以写在SubShader语义块中(表面着色器做法)3D素材,也可以写在Pass语义块中(顶点、片元着色器和固定函数着色器做法)
《Shaders must die》是Unity的渲染工程师Aras所发表的博客unity 顶点着色器,他认为顶点着色器和片元着色器是一种非常反人类的设计方式,虽然对硬件来说非常友好,但是不便于学习和理解。所以他设计了一种新的着色器结构,将原本的顶点着色器和片元着色器合并为同一个着色器,称之为表面着色器。
相比于顶点和片元着色器,表面着色器为着色器增加了一层新的抽象。相比于之前的顶点和片元着色器,表面着色器更为高级(这里的高级不是好与不好,类似于Python是一门高级语言而汇编是一门低级语言)
表面着色器无需写在pass中,示例如下:
顶点/片元着色器也需要定义在CGPROGRAM和ENDCG直接,需要写在Pass语义块中,示例如下:
Unity Shader是使用ShaderLab语言编写的unity 顶点着色器音乐音效,但是可以在ShaderLab内部嵌套CG/HLSL代码来编写着色器代码
格式:
1
2
3
4
5
6
7
8
9
Pass {
//Pass的标签和状态设置
CGPROGRAM
//编译指令,例如:
#pragma vertex vert
#pragma fragment frag
//CG代码
ENDCG
//其他的一些设置
文章来源:https://shanhainanhua.github.io/2023/04/23/Unity-Shader%E5%9F%BA%E7%A1%80/