参考文章:Unity着色器介绍
Shader基础
Properties
声明格式
- [optional: attribute] name(“display text in Inspector”, type name) = default value
属性类型
- Color:颜色属性,表示 RGBA 颜色值。
- Range:范围属性,表示一个在指定范围内的浮点数值。
- Float:浮点数属性,表示一个浮点数值。
- Int(旧) Integer(新):整数属性,表示一个整数值。
- Vector:向量属性,表示一个二维或三维向量。
- 2D:二维纹理属性,表示一个二维纹理。
- Cube:立方体纹理属性,表示一个立方体纹理。
- 3D:三维纹理属性,表示一个三维纹理。
- 2DArray:二维纹理数组属性,表示一个二维纹理数组。
- CubeArray:立方体纹理数组属性,表示一个立方体纹理数组。
- Any:任意类型属性,表示一个支持的任意类型值。
属性特性
- [HideInInspector] - 不在材质检视面板中显示属性值。
- [NoScaleOffset] - 对于具有此特性的纹理属性,材质检视面板不会显示纹理平铺/偏移字段。
- [Normal] - 表示纹理属性需要法线贴图。
- [HDR] - 表示纹理属性需要高动态范围 (HDR) 纹理。
- [Gamma] - 表示在 UI 中将浮点/矢量属性指定为 sRGB 值(就像颜色一样),并且可能需要根据使用的颜色空间进行转换。请参阅着色器程序中的属性。
- [PerRendererData] - 表示纹理属性将以 MaterialPropertyBlock 的形式来自每渲染器数据。材质检视面板会更改这些属性的纹理字段 UI。
- [MainTexture] 设置材质的主纹理
- [MainColor] 设置材质的主颜色
SubShader
描述:子着色器允许您将着色器对象分离为与不同硬件、渲染管线和运行时设置兼容的部分。
子着色器包含:
- 有关此子着色器与哪些硬件、渲染管线和运行时设置兼容的信息
- 子着色器标记,它们是键值对,提供有关子着色器的信息
- 一张或多张Pass
格式
SubShader
{
<optional: LOD>
<optional: tags>
<optional: commands>
<One or more Pass definitions>
}
Tags
格式
Tags { “[name1]” = “[value1]” “[name2]” = “[value2]”}
类型
-
Queue tag
-
描述:该标签告诉 Unity 要将其渲染的几何体用于哪个渲染队列。渲染队列是决定 Unity 渲染几何体顺序的因素之一
-
Signature Function “Queue” = “[queue name]” 使用命名的渲染队列 “Queue” = “[queue name] + [offset]” 使用与命名队列有给定偏移量的未命名队列。这有用的一个例子是透明水,您应该在不透明对象之后但在透明对象之前绘制它 -
Signature Value (类型) Function [queue name] Background 指定后台呈现队列 Geometry 指定几何体渲染队列 AlphaTest 指定 AlphaTest 呈现队列 Transparent 指定透明呈现队列 Overlay 指定叠加呈现队列 [offset] integer 指定 Unity 相对于命名队列呈现未命名队列的索引
-
-
RenderPipeline tag
- 描述:该标签告诉 Unity 子着色器是否与通用渲染管线 (URP) 或高清渲染管线 (HDRP) 兼容
-
Signature Value (类型) Function [name] UniversalRenderPipeline This SubShader is compatible with URP only. HighDefinitionRenderPipeline This SubShader is compatible with HDRP only. (any other value, or not declared) This SubShader is not compatible with URP or HDRP. - eg:
Tags { "RenderPipeline" = "UniversalRenderPipeline" }
(any other value, or not declared) This SubShader is not compatible with URP or HDRP.
-
RenderType tag
- 描述:使用该标记覆盖着色器对象的行为。
- 类型
- Opaque: 用于大多数着色器(法线着色器、自发光着色器、反射着色器以及地形的着色器)。
- Transparent:用于半透明着色器(透明着色器、粒子着色器、字体着色器、地形额外通道的着色器)。
- TransparentCutout: 蒙皮透明着色器(Transparent Cutout,两个通道的植被着色器)。
- Background: Skybox shaders. 天空盒着色器。
- Overlay: GUITexture, Halo, Flare shaders. 光晕着色器、闪光着色器。
- TreeOpaque: terrain engine tree bark. 地形引擎中的树皮。
- TreeTransparentCutout: terrain engine tree leaves. 地形引擎中的树叶。
- TreeBillboard: terrain engine billboarded trees. 地形引擎中的广告牌树。
- Grass: terrain engine grass. 地形引擎中的草。
- GrassBillboard: terrain engine billboarded grass. 地形引擎何中的广告牌草。
-
Signature Function “RenderType” = “[renderType]” B使设置此子着色器的渲染类型值用命名的渲染队列
-
ForceNoShadowCasting tag
- 描述:该标签可防止子着色器中的几何体投射(有时接收)阴影。确切的行为取决于渲染管线和ForceNoShadowCasting渲染路径
- 类型
- True
- False
-
DisableBatching tag
- 描述:标签用于指定当前渲染状态不支持批处理。当一个对象使用具有相同材质的 Mesh 渲染时,Unity 会尝试将它们合并为一个批次进行渲染,以减少渲染调用的数量,提高渲染性能。但是在某些情况下,批处理会导致渲染结果出错或性能下降,此时可以使用 DisableBatching 标签来禁用批处理.
- 类型
- True
- False
-
IgnoreProjector tag
- 描述:标签用于指定当前渲染状态不受投影机的影响。当一个场景中包含有一个或多个投影机时,投影机会将场景中的对象投射到相应的投影面上,形成投影效果。但是在某些情况下,需要禁用某些对象的投影效果,例如天空盒、水面等,此时可以使用 IgnoreProjector 标签来指定不受投影机的影响.
- 类型
- True
- False
-
PreviewType tag
- 描述:标签用于指定在 Shader Inspector 面板中显示 Shader 预览图的类型。当使用自定义 Shader 开发时,可以使用 PreviewType 标签来指定在 Shader Inspector 面板中显示预览图的方式,以方便开发者对 Shader 效果进行调试和预览。
- 类型
- Sphere
- Plane
- Skybox
-
CanUseSpriteAtlas tag
- 描述:在使用旧版精灵打包器的项目中使用此 SubShader 标签来警告用户着色器依赖于原始纹理坐标,因此他们不应将其纹理打包到图集中。
- 类型
- True
- False
LOD
描述:使用此技术可以微调不同硬件上的着色器性能。当 SubShader 理论上由用户的硬件支持,但硬件无法很好地运行它时,这很有用.Unity优先考虑值较低的子着色器.
顺序:当 Unity 首次使用着色器对象渲染几何体时,或者当着色器 LOD 值或活动渲染管线更改时:
Unity 遍历所有子着色器的列表并检查它们以确定它们是否:与设备硬件兼容;等于或低于当前着色器详细位置价值;并与活动渲染管线兼容。
- 如果列表包含一个或多个满足这些要求的子着色器,则会选择第一个子着色器。这是活动的子着色器。
- 如果列表不包含任何满足所有要求的子着色器:
- 如果列表包含一个或多个满足硬件要求(但不满足 LOD 或渲染管线要求)的子着色器,Unity 将选择第一个子着色器。这是活动的子着色器。
- 如果列表中不包含任何满足硬件要求的子着色器,Unity 将显示错误着色器。
-
eg:
LOD 200
Pass
描述:一个Pass包含:
- 标签,它们是键值对,提供有关Pass的信息
- 在运行着色器程序之前更新渲染状态的说明
- 着色器程序,组织成一个或多个着色器变体
格式
Pass
{
<optional: name>
<optional: tags>
<optional: commands>
<optional: shader code>
}
- 指定名字:
Name "<name>"
- eg :
Name "ExampleNamedPass"
- eg :
- 分配标签:LightModeTags和Tags block
- 命令:
- AlphaToMask: 是一种用于深度测试和抗锯齿的技术,通常用于半透明物体的渲染.
- Blend: 启用和配置 Alpha 混合.
- BlendOp: 设置混合命令使用的操作.
- ColorMask: 设置颜色通道写入蒙版 .
- Conservative: 启用和禁用保守光栅化.
- Cull:设置多边形剔除模式.
- Offset: 设置多边形深度偏移.
- Stencil: 配置模板测试,以及要写入的内容模板缓冲区.
- ZClip: 设置深度剪辑模式.
- ZTest: 设置深度测试模式.
- ZWrite: 设置深度缓冲区写入模式
- UsePass:减少重复性代码
- GrabPass :抓取屏幕纹理
添加着色器块
- cg
- hlsl
指定包要求
- 有多种方法可以声明包要求。每个都提供不同的行为。它们是:
- “<包名称>”:指定子着色器或通道适用于包的任何版本。
- “<包名称>”: “<版本限制>”:指定子着色器或通道仅适用于包版本的子集。
- “<包名称>”: “unity=<版本限制>”:指定子着色器或通道仅适用于 Unity 版本的子集,并且需要 具有给定名称的包。
- “unity”:“<版本限制>”:指定子着色器或通道仅适用于 Unity 版本的子集。
-
PackageRequirements { "com.unity.render-pipelines.universal": "[10.2.1,11.0]" "com.unity.textmeshpro": "3.2" }
例子
Pass{
Name "ExamplePassName"
Tags { "ExampleTagKey" = "ExampleTagValue" }
// ShaderLab commands go here.
// HLSL code goes here.
}
代码例子
简单的无光照着色器
Shader "Unlit/SimpleUnlitTexturedShader"
{
Properties
{
// we have removed support for texture tiling/offset,
// so make them not be displayed in material inspector
[NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
}
SubShader
{
Pass
{
CGPROGRAM
// use "vert" function as the vertex shader
#pragma vertex vert
// use "frag" function as the pixel (fragment) shader
#pragma fragment frag
// vertex shader inputs
struct appdata
{
float4 vertex : POSITION; // vertex position
float2 uv : TEXCOORD0; // texture coordinate
};
// vertex shader outputs ("vertex to fragment")
struct v2f
{
float2 uv : TEXCOORD0; // texture coordinate
float4 vertex : SV_POSITION; // clip space position
};
// vertex shader
v2f vert (appdata v)
{
v2f o;
// transform position to clip space
// (multiply with model*view*projection matrix)
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
// just pass the texture coordinate
o.uv = v.uv;
return o;
}
// texture we will sample
sampler2D _MainTex;
// pixel shader; returns low precision ("fixed4" type)
// color ("SV_Target" semantic)
fixed4 frag (v2f i) : SV_Target
{
// sample texture and return it
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
}
}
}