Unity Shader Properties详解

在Unity中,Shader的Properties部分是一个非常重要的组成部分。它允许开发者为Shader定义可以在Unity编辑器中调整的参数,例如颜色、纹理、浮点数或向量等。通过Properties,用户无需修改Shader代码,就能在材质(Material)面板中直观地调整Shader的外观和行为。


Properties的作用

Properties在Shader中主要有以下几个作用:

  • 定义可调参数:通过Properties,开发者可以声明Shader中需要调整的变量,并在Unity编辑器中为这些变量赋值。
  • 与材质交互:用户通过材质面板修改这些参数,直接影响Shader的渲染效果。
  • 代码引用:在Shader的CG/HLSL代码中,可以通过Properties中定义的变量名访问这些参数。

简单来说,Properties是Shader与Unity编辑器之间的桥梁,增强了Shader的灵活性和可交互性。


Properties的语法

Shader "Custom/MyShader"
{
    Properties
    {
        _PropertyName ("Display Name", PropertyType) = DefaultValue
        // 更多属性...
    }
    
    SubShader
    {
        // 着色器代码...
    }
}
  • _PropertyName:属性的内部名称,以下划线_开头,用于在Shader代码中引用。
  • "Display Name":属性在Unity编辑器中显示的名称,便于用户理解。
  • Type:属性的数据类型,例如Float、Color、2D等。
  • DefaultValue:属性的默认值,在材质创建时生效。

常见的属性类型

Unity Shader支持多种属性类型,每种类型对应特定的数据和编辑器控件。以下是常见的类型及其用法:

(1) Float(浮点数)

  • 语法:_FloatProp ("Float Property", Float) = 1.0
  • 用途:用于控制浮点参数,如透明度、强度等。
  • 编辑器显示:一个输入框或滑动条。

(2) Range(范围)

  • 语法:_RangeProp ("Range Property", Range(min, max)) = 0.5
  • 用途:限制浮点数的取值范围,例如透明度(0-1)或缩放(0.1-10)。
  • 编辑器显示:一个滑动条,范围从min到max。

(3) Color(颜色)

  • 语法:_ColorProp ("Color Property", Color) = (1,1,1,1)
  • 用途:定义颜色,例如物体主色调或光照颜色。值范围为(R,G,B,A),每个分量通常在0-1之间。
  • 编辑器显示:一个颜色选择器。

(4) Vector(向量)

  • 语法:_VectorProp ("Vector Property", Vector) = (0,0,0,0)
  • 用途:存储四维向量,例如UV偏移或方向。
  • 编辑器显示:四个浮点数输入框。

(5) 2D(纹理)

  • 语法:_TextureProp ("Texture Property", 2D) = "white" {}
  • 用途:加载2D纹理,例如漫反射贴图或法线贴图。
  • 编辑器显示:一个纹理选择器。
  • 默认值:可以是"white"(白色)、"black"(黑色)、"gray"(灰色)、"bump"(法线贴图默认值)等Unity内置纹理。
  • 纹理默认值选项:
  • "white":全白纹理(RGBA: 1,1,1,1)
  • "black":全黑纹理(RGBA: 0,0,0,1)
  • "gray":灰色纹理(RGBA: 0.5,0.5,0.5,1)
  • "bump":法线贴图蓝色(RGBA: 0.5,0.5,1,1)
  • "red":红色纹理(RGBA: 1,0,0,1)
  • "empty":完全透明纹理(RGBA: 0,0,0,0)

(6) Cube(立方体贴图)

  • 语法:_CubeProp ("Cube Property", Cube) = "" {}
  • 用途:用于环境反射或天空盒效果。
  • 编辑器显示:一个立方体贴图选择器。

(7) 3D(3D纹理)

  • 语法:_3DProp ("3D Property", 3D) = "" {}
  • 用途:用于体积纹理,例如噪声图。
  • 编辑器显示:一个3D纹理选择器。

属性修饰符

Properties支持一些修饰符,用于控制属性的行为或显示方式。以下是常见的修饰符:

 [HideInInspector]

  • 语法:[HideInInspector] _HiddenProp ("Hidden Property", Float) = 1.0
  • 作用:隐藏属性,使其不在材质面板中显示,但仍可在代码中使用。

[NoScaleOffset]

  • 语法:[NoScaleOffset] _TextureProp ("Texture Property", 2D) = "white" {}
  • 作用:对于纹理属性,隐藏缩放(Scale)和偏移(Offset)控件。

 [Normal]

  • 语法:[Normal] _NormalMap ("Normal Map", 2D) = "bump" {}
  • 作用:标记该纹理为法线贴图,Unity会自动处理法线解码。

 [HDR]

  • 语法:[HDR] _HDRColor ("HDR Color", Color) = (1,1,1,1)
  • 作用:允许颜色值超过1.0,适用于高动态范围(HDR)效果。

[Header] 和 [Space]

用于组织材质Inspector,提高可读性。

[Header(Main Settings)]
_MainTex ("Albedo", 2D) = "white" {}

[Space(10)]
[Header(Normal Mapping)]
_BumpMap ("Normal Map", 2D) = "bump" {}

[Toggle] 和 [ToggleOff]

提供布尔值复选框控件:

  • [Toggle]:值为1时启用
  • [ToggleOff]:值为0时启用

[Enum]

创建下拉菜单选择控件,可以使用内置枚举或自定义值。

[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Culling Mode", Float) = 2
[Enum(Off,0,On,1)] _ZWrite ("ZWrite", Float) = 1

[KeywordEnum]

生成着色器变体的下拉菜单,并自动定义对应着色器关键字。

[PowerSlider]

创建非线性分布的滑动条控件,使得低值区域有更细致的控制。

[PowerSlider(3.0)] _Shininess ("Shininess", Range(0.01, 1)) = 0.08

4.9 [MainTexture] 和 [MainColor]

标记主纹理和主颜色,用于材质球预览和全局控制。

[MainTexture] _BaseMap ("Base Map", 2D) = "white" {}
[MainColor] _BaseColor ("Base Color", Color) = (1,1,1,1)


在Shader代码中引用Properties

在Shader的CG/HLSL代码中,需要先声明Properties中的变量,然后才能使用它们。声明的类型必须与Properties中定义的类型匹配。

示例:

Properties
{
    _MainTex ("Main Texture", 2D) = "white" {}
    _Color ("Main Color", Color) = (1,1,1,1)
    _FloatValue ("Float Value", Float) = 0.5
}

SubShader
{
    Pass
    {
        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag

        sampler2D _MainTex;    // 声明2D纹理
        float4 _Color;         // 声明颜色(四维向量)
        float _FloatValue;     // 声明浮点数

        // 顶点着色器和片段着色器代码...
        ENDCG
    }
}

在代码中,_MainTex、 _Color和_FloatValue可以通过材质面板的值直接访问和使用。


实际应用示例

以下是一个简单的漫反射Shader示例,包含主纹理和颜色属性:

Shader "Custom/SimpleDiffuse"
{
    Properties
    {
        _MainTex ("Main Texture", 2D) = "white" {}
        _Color ("Diffuse Color", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _Color;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 texColor = tex2D(_MainTex, i.uv);
                return texColor * _Color;
            }
            ENDCG
        }
    }
}

解释:

  • Properties:定义了_MainTex(纹理)和_Color(颜色)。
  • CGPROGRAM:声明并使用这两个变量。
  • 效果:片段着色器将纹理颜色与用户设置的颜色相乘,生成最终颜色。
  • 交互:用户可在材质面板中选择纹理和调整颜色,实时预览效果。

注意事项

  • 命名规则:属性名称必须以_开头,且在Shader中唯一。
  • 类型匹配:CG/HLSL代码中的变量类型需与Properties中的类型一致。
  • 性能:过多属性会增加材质复杂性,建议只定义必要的参数。
  • 兼容性:某些类型(如3D纹理)在部分平台上可能不受支持,需注意目标平台的限制。

智慧消防安全与应急管理是现代城市安全管理的重要组成部分,随着城市化进程的加速,传统消防安全管理面临着诸多挑战,如消防安全责任制度落实不到位、消防设施日常管理不足、消防警力不足等。这些问题不仅制约了消防安全管理水平的提升,也给城市的安全运行带来了潜在风险。然而,物联网和智慧城市技术的快速发展为解决这些问题提供了新的思路和方法。智慧消防作为物联网和智慧城市技术结合的创新产物,正在成为社会消防安全管理的新趋势。 智慧消防的核心在于通过技术创新实现消防安全管理的智能化和自动化。其主要应用包括物联网消防安全监管平台、城市消防远程监控系统、智慧消防平台等,这些系统利用先进的技术手段,如GPS、GSM、GIS等,实现了对消防设施的实时监控、智能巡检和精准定位。例如,单兵定位方案通过信标点定位和微惯导加蓝牙辅助定位技术,能够精确掌握消防人员的位置信息,从而提高救援效率和安全性。智慧消防不仅提升了消防设施的管理质量,还优化了社会消防安全管理资源的配置,降低了管理成本。此外,智慧消防的应用还弥补了传统消防安全管理中数据处理方式落后、值班制度执行不彻底等问题,赋予了建筑消防设施智能化、自动化的能力。 尽管智慧消防技术在社会消防安全管理工作中的应用已经展现出巨大的潜力和优势,但目前仍处于实践探索阶段。相关职能部门和研究企业需要加大研究开发力度,进一步完善系统的功能与实效性。智慧消防的发展既面临风险,也充满机遇。当前,社会消防安全管理工作中仍存在制度执行不彻底、消防设施日常维护不到位等问题,而智慧消防理念与技术的应用可以有效弥补这些弊端,提高消防安全管理的自动化与智能化水平。随着智慧城市理念的不断发展和实践,智慧消防将成为推动社会消防安全管理工作与城市化进程同步发展的关键力量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值