Shader基础

文章介绍了Unity着色器的基础,包括Properties中的各种属性类型如Color、Float和纹理属性,以及属性特性如[HideInInspector]。SubShader部分讲解了其结构和作用,如LOD、Tags以及不同类型的Pass,还涉及渲染队列、渲染管线和渲染类型的相关标签。
摘要由CSDN通过智能技术生成

参考文章: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 渲染几何体顺序的因素之一

    • SignatureFunction
      “Queue” = “[queue name]”使用命名的渲染队列
      “Queue” = “[queue name] + [offset]”使用与命名队列有给定偏移量的未命名队列。这有用的一个例子是透明水,您应该在不透明对象之后但在透明对象之前绘制它
    • SignatureValue (类型)Function
      [queue name]Background指定后台呈现队列
      Geometry指定几何体渲染队列
      AlphaTest指定 AlphaTest 呈现队列
      Transparent指定透明呈现队列
      Overlay指定叠加呈现队列
      [offset]integer指定 Unity 相对于命名队列呈现未命名队列的索引
  • RenderPipeline tag

    • 描述:该标签告诉 Unity 子着色器是否与通用渲染管线 (URP) 或高清渲染管线 (HDRP) 兼容
    • SignatureValue (类型)Function
      [name]UniversalRenderPipelineThis SubShader is compatible with URP only.
      HighDefinitionRenderPipelineThis 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. 地形引擎何中的广告牌草。
    • SignatureFunction
      “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>
}
  1. 指定名字:Name "<name>"
    • eg : Name "ExampleNamedPass"
  2. 分配标签:LightModeTags和Tags block
  3. 命令:
    • 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
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值