着色器语法解析00
着色器语法解析00
官方文档
通用渲染管线概述 | Universal RP | 12.1.1 (unity3d.com)
基础着色器(Shader)文件模板解析
Shader文件
1
2
3
4
5
6
7
8
9
10
11
12
13
//代码块说明中, "_"代表"空格";
//请切换到英文输入法, 大部分的中文标点会导致程序报错.
//Shader{}
//其中Shader_"string"
//string: 该参数代表着色器在调用时的路径, 以"/"分割子路径
Shader "StarUnion/Practise/URPUnlitShaderBasic"
{
Properties{} //面板参数
SubShader{} //着色器代码本体
FallBack "VertexLit" //如果渲染不成功, 则使用""中指定名称的着色器进行渲染.
CustomEditor "StandardShaderGUI" //编辑器中, 使用""中指定的面板脚本绘制自定义面板.
}
Propertise块
Unity - Manual: ShaderLab: defining material properties (unity3d.com)
着色器参数声明格式如下
1
[optional: attribute] name("display text in Inspector", type name) = default value
这里会依次讲解各个部分的填充内容
[optional: atrribute]
作用: 用于配置特殊的参数规则.
规则: optional: atrribute(可配置属性), 不区分大小写, 但渲染组规则为”首字母大写+驼峰式大小写(Camel-Case)”.
具体参数:
[Gamma]: 适用于Vector类参数. 这个属性在项目色彩空间为”Gamma”时, 没有任何作用. 在项目色彩空间为”Linear”的情况下, 会让冠以这个属性的参数的变换和Gamma空间时变换率一致. (公司暂时不会有Linear空间下的项目, 该属性在实际使用中可以略过)
第一行和第二行: 在Gamma空间下, 加/不加[Gamma]属性, 数值导致灰度的变化情况.
第三行: 在Linear空间下, 不加[Gamma]属性, 数值导致灰度的变化情况.(结果正确, 但和Gamma空间不一致)
第四行: 在Linear空间下, 加上[Gamma]属性, 数值导致灰度的变化情况.(与Gamma空间一致).
1
[Gamma]_GammaValue("Gamma修正数值", Range(0,1)) = 0
[HDR]: 该属性适用于贴图/颜色类参数. 如果贴图本身是LDR贴图(公司项目大部分贴图都是LDR贴图), 则会报Warning.
1
[HDR]_HDRColor("HDR颜色", Color) = (1,1,1,1)[HideInInspector]: 该属性会让对应的参数在面板上不显示.(不显示但不影响程序调用, 适用于不想被美术调整, 但可以被程序调整的参数)
- [MainTexture]: 该属性适用于贴图类参数. 使用该属性的贴图类参数, 可以在C#脚本中通过”Material.mainTexture“在脚本中获取到. 同时, 如果不使用该属性, 也可以将参数名设置为”_MainTex”, 达到同样的结果. 另, 如果多个贴图参数都使用了这一属性, 那么只有第一个使用这一属性的参数会生效.
- 注意:当您使用此属性设置主纹理时,当您使用纹理流(Unity - Manual: The Mipmap Streaming system)调试视图模式(texture streaming debugging view mode)或自定义调试工具时,纹理在游戏视图中不可见。
[MainColor]: 该属性适用于颜色类参数. 使用该属性的颜色类参数, 可以在C#脚本中通过”Material.color“在脚本中获取到. 同时, 如果不使用该参数, 也可以将参数名设置为”_Color”, 达到同样的结果. 另, 如果多个颜色参数都使用了这一属性, 那么只有第一个使用这一属性的参数会生效.
[NoScaleOffset]: 该属性适用于贴图类参数. 使用该属性的贴图类参数, 在面板上不会出现Scale和Offset调整框.
[Normal]: 该属性适用于贴图类参数. 使用该属性的贴图类参数, 会检测该参数所赋值是否设置为”Normal Map”, 如果不是, 则会提醒.
- [PerRendererData]: 该属性适用于贴图类参数, 表示该参数是通过不同”per-renderer data”, 以”MaterialPropertyBlock“形式传入. 在面板上, 该参数显示为”只读”.
name
作用: 该名称用于建立Propertise面板参数与Shader公共参数的关联, 两者的名称要统一, 在”公共参数“部分会详细说明.
规则:
以”_“开头, “首字母大写+驼峰式大小写(Camel-Case)”
1
_NoScaleOffsetTex("简化参数贴图", 2D) = "white" {}
贴图类: _[*]Tex
1 2 3 4 5
_MainTex _NormalTex _FlowTex _AnisotropyTex ...
颜色类: 暂定
值类: 暂定
(“display text in Inspector”, type name) = default value
- 作用: 面板显示, 及初始值赋予.
“display text in Inspector”
作用: 面板上显示的参数名, 可以用中文, 建议尽量用中文.
规则: 通常为”name”的直接翻译.
1 2 3 4 5
"主贴图" "法线贴图" "Flow贴图" "各向异性贴图" ...
type name
作用: 面板上根据不同的type name调用不同的面板显示.
规则: 不区分大小写, 但渲染组规则为”首字母大写”.
具体参数:
Float: 通常数值.
Range(0.0, 1.0): 浮点数范围. 其中0.0和1.0可以替换为任意的浮点数.
Color: 颜色.
Int: 整数数值, 2020版本还在使用, 但2021版本多一个”Integer“供使用. 两者区别为, “Int“返回的仍旧是浮点数(测试下来类似将面板的数据进行了floor()函数处理), “Interger“返回的是整数.
Vector: 面板上为Vector4.
2D: Texture2D, 2D贴图.
2DArray: Texture2DArray, 要求是OpenGL ES3.0及以上. 检测API为”SystemInfo.supports2DArrayTextures”. Unity技术分享(100)| Texture2DArray、粒子系统的性能开销……
3D: Texture3D, 3D贴图. 但官方文档里面的256*256*256, RGBA32, 大小为512MB, 但实际代码生成如下, 为64MB.
Cube: Cubemap, 用于天空盒或者反射盒.
CubeArray: Cubemap arrays. 同Texture2DArray, 仅仅是对象换成了Cubemap.
default value
作用: 面板上的参数默认值.
规则:
Float: 任何Float允许的数值皆可.
1 2
_SimpleFloat("普通数值", Float) = 0 _SimpleFloat("普通数值", Float) = 0.5
Range: 任何Float允许的数值皆可, 但建议初始值在Range范围内.
1 2 3
_Range("范围", Range(0.0,1.0)) = 0 _Range("范围", Range(0.0,100.0)) = 10 _Range("范围", Range(200.0,100.0)) = 110
Color: (f,f,f,f)
1 2 3 4 5
_SimpleColor("普通颜色", Color) = (1,1,1,1) _SimpleColor("普通颜色", Color) = (0,0,0,1) _SimpleColor("普通颜色", Color) = (1,0,0,1) _SimpleColor("普通颜色", Color) = (0.5,0.5,0.5,1) _SimpleColor("普通颜色", Color) = (.5,.5,.5,1)
Int: 任意整数皆可(在2020版本中, 仍旧是以浮点数存储的, 严格来说, 任何浮点数皆可)
1 2
_Int("整数", Int) = 0 _Int("整数", Int) = 1
Vector: (f,f,f,f)
1
_Vector("向量", Vector) = (0,0,0,0)2D: “[color]” {}, 其中[color]为black, gray, white, red, bump. 其中bump是Normal图专用, 具体值为RGBA: 0.5,0.5,1,0.5. 另, 如果不填, 则默认值为gray. 另, 如果[color]指定为black时, 在ASTC纹理平台(苹果), 其具体值为RGBA: 0,0,0,1, 而在ETC纹理平台(安卓), 其具体值为RGBA: 0,0,0,0. 基于以上建议, 如果需要在多平台兼容且用到纹理Alpha值, 则需要注意此差别.
[2018.1]Unity贴图压缩格式设置 - 知乎 (zhihu.com)
1 2 3 4 5 6
_Tex("贴图", 2D) = "" {} _Tex("贴图", 2D) = "white" {} _Tex("贴图", 2D) = "gray" {} _Tex("贴图", 2D) = "black" {} _Tex("贴图", 2D) = "red" {} _Tex("贴图", 2D) = "bump" {}2DArray: “” {}
1
_TexArray("贴图组", 2DArray) = "" {}
3D: “” {}
1
_3DTex("3D贴图", 3D) = "" {}
Cube: “” {}
1
_CubeMap("Cube贴图", Cube) = "" {}
CubeArray: “” {}
1
_CubeMapArray("Cube贴图组", CubeArray) = "" {}

