目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:ShaderLab Syntax
版本:2019.1
ShaderLab Syntax
ShaderLab语法
在Unity中所有的Shader文件都使用强定义语言叫:“ShaderLab”。在文件中,大括号括起来的语法声明了描述着色器的各种东西——例如,Material Inspector中应该显示哪些着色器属性;要做什么样的硬件回退(shader fallback保底设置);使用何种混合模式等;而实际的“着色器代码”是用 CGPROGRAM 代码片段在相同的着色器文件中编写的(参见surface shaders表面着色器和vertex and fragment shaders顶点和片段着色器)。
这个页面和子页面将说明描述哦关于"ShaderLab"的语法内容。CGPROGRAM 内的代码是用编写一般的HLSL/Cg的着色器语言的,查看它们对应的文档页面。
Shader块是一个Shader文件的结构的根节点。每个文件必须要定义一个(有且只有一个)Shader块。它指定了任意的对象的材质使用了该shader文件后将会如何被渲染的。
Syntax
语法
Shader "name" { [Properties] __Subshaders__ [Fallback] [CustomEditor] }
定义一个Shader。它的name名称将在Material Inspector中的Shader选项列表中出现。Shader的可选项 Properties 可以定义Material Inspector中对应Shader的属性。在这些Subshaders随后定义的是一个可选的Fallback和CustomEditor的定义。
Details
详细了解
Properties
Shader可以拥有一个properties的属性列表。任意一个在properties中定义的都将会在Unity编辑器的Material Inspector中显示。通常shader中的properties定义一些对象的颜色,纹理,或是一些专门使用特殊使用的数值。
SubShader & Fallback
SubShader 与 Fallback
没个shader都包含一些sub-shaders。你必须至少要有一个SubShader,当加载shader时,Unity将会遍历一遍Subshader列表,并拿取第一个用户机器可以支持的来运行。如果没有subshader可以支持的,Unity将会尝试使用 fallback shader。
不同的显卡有这部同的功能。这给游戏开发者提出了一个永恒的问题;你想你的游戏在最新的硬件中表现优秀,但不想用户量仅占有市场的3%。这就是为啥需要subshader。创建一个subshader针对吊炸天的显卡效果使用,然后再添加多一个subshader针对一些比较老旧的显卡。这些subshader也许实现你期望的效果时会比较低效,或这些subshader也可以考虑不现实一些效果,来提升兼容性,与性能。
Shader"level of detal"(LOD)和"shader replacement"的两种技术都是再提供的subshader基础上现实的,查看 Shader LOD 和 Shader Replacement了解详情。
Examples
这儿是一个最简单的shader:
// 带顶点光照
Shader "Simple colored lighting"
{
// 一个颜色属性
Properties {
_Color ("Main Color", Color) = (1,.5,.5,1)
}
// 定义一个subshader
SubShader
{
// 在该subshader内的一个pass
Pass
{
// 使用逐顶顶光照的固定函数
Material
{
Diffuse [_Color]
}
Lighting On
}
}
}
这个shader定义了一个颜色的属性 _Color (它将在Material Inspector中显示为 Main Color)并带有默认值为:(1,0.5,0.5,1)。然后是一个subshader的定义。该subshader有一个使用固定函数的顶点光照的Pass。
了解更多复杂的例子,查看 Surface Shader Examples 或 Vertex and Fragment Shader Examples。