一.Shaderlab语法
1.给Shader起名字
Shader "Custom/MyShader"
这个名称会出现在材质选择使用的下拉列表里
2. Properties (属性)
Properties
{
Name ("display name",ProperType)=DefaultValue
//更多属性
}
Name:用于Shader中访问的名字
display name:出现在材质面板的名字
ProperType:它的类型
3.SubShader
每一个Unity Shader文件可以包含多个SubShader语义块,但至少要有一个
SubShader {
//可选的
[Tags]
//可选的
[RenderSetup]
Pass{
}
//Other Pass
}
Pass尽量不要太多,太多往往会造成渲染性能的下降
(1)状态设置
下面是常见的状态设置选项
(2).Tags:是一个键值对(Key/Value Pair)
用来告诉Unity的渲染引擎:SubShader我希望怎么以及何时渲染这个对象
结构如下:
Tags {"TagName1"="Value1" "TagName2"="Value2"}
支持的标签类型如下:
(3)Pass语义块
Pass{
[Name]
[Tags]
[RenderSetup]
//Other code
}
1.Name:在Pass中定义该Pass的名称,我可以使用ShaderLab中的UsePass命令来直接使用其他Unity Shader中的Pass(使用大写形式的名字)
2.Pass中的标签(Tags):不同于SubShader中的标签
Pass中使用的标签类型如下:
3.Usepass:可以复用其他Unity Shader中的Pass
GrabPass:负责抓取屏幕并结果存储在一张纹理中,以用于后续的Pass处理(截屏)
4.Fallback(留一条后路)
如果上面所有的SubShader在这块显卡上不能运行,那么就使用这个最低级的Shader
Fallback "name"
当然你也可以不指定它(关闭这个功能),然后所有不能跑的话就不执行任何操作
5.CGPROGRAM和ENDCG
CGPROGRAM和ENDCG之间的代码是使用了CG/HLSL编写的,也就是说我们需要把CG/HLSL语言嵌套在ShaderLab语言中.
CG代码片段通常是位于Pass语义内部的
GlSL的代码嵌套在GLSLPROGRAM和ENDGLSL之间
6.#prama 编译指令
#pragma 编译指令: #pargma 关键词 函数名 光照模型 [其它选项]
每个CG片段必须至少包含一个顶点程序和一个片段程序。因此需要#pragma vertex和#pragma fragment指令。
编译指令留着再写一篇博客:暂时还没写
二丶Unity Shader的形式
Shader "MyShader"
{
Properties
{
//所需的各种属性
}
SubShader
{
//真正意义上的Shader代码会出现在这里
//表面着色器(Surface Shader)或者
//顶点/片元着色器(Vertex/Fragment Shader)或者
//固定函数着色器(Fixed Function Shader)
}
SubShader
{
//和上一个SubShader类似
}
}
作者:Ligo丶
出处:https://www.cnblogs.com/Ligo-Z/
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。