Unity3D游戏开发unity修炼之路Unity Shader分享

[Unity 5.xShaders]Diffuse Shader

2016-12-22  本文已影响88人  霸俊流年

添加并使用Properties#


Inspector属性
Properties是shader的一个非常重要的一部分,它可以设置使用shader的material在Insppector视图的展示信息,可以定义一些参数属性让我们在后面使用,以上是默认属性的展示。

准备阶段

以下的脚本中的第二行开始,可以看到一个Properties和{}包含的信息,这些就是我们需要操作的部分:

Shader "Custom/StandardDiffuse" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        CGPROGRAM
        struct Input {
        };

        void surf (Input IN, inout SurfaceOutputStandard o) {
        }
        ENDCG
    }
    FallBack "Diffuse"
}

如何实现

  1. 创建一个默认的Surface Shader;
  2. 在Properties添加两行代码:
    _AmbientColor("Ambient Color", Color) = (1,1,1,1)
    _MySliderValue("This is a Slider", Range(0,10)) = 2.5
  3. fixed4 _Color脚本后添加两行脚本
    float4 _AmbientColor;
    float4 _MySliderValue;
  4. 修改surf函数的第一行:
    fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * pow((_Color+ _AmbientColor), _MySliderValue);
  5. 用生成的shader创建一个新的material并运用到一个Cube上,可以自己去尝试修改material的参数。

具体效果

左边是默认的材质球效果,右边是运用新shader后稍微调节后的效果.png

解释说明

  1. 整体代码效果如下:
Shader "Custom/StandardDiffuse/Properties" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
            _AmbientColor("Ambient Color", Color) = (1,1,1,1)
            _MySliderValue("This is a Slider", Range(0,10)) = 2.5
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        
        CGPROGRAM
        // Physically based Standard lighting model, and enable shadows on all light types
        #pragma surface surf Standard fullforwardshadows

        // Use shader model 3.0 target, to get nicer looking lighting
        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        float4 _AmbientColor;
        float4 _MySliderValue;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            // Albedo comes from a texture tinted by color
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * pow((_Color+ _AmbientColor), _MySliderValue);
            o.Albedo = c.rgb;
            // Metallic and smoothness come from slider variables
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

注意查看Properties中的代码,大家不难发现大体所有的代码都呈现以下的样式:


Properties代码结构图.png
  1. 第一个是Variable Name,是你的代码中将要使用的名字;第二个是Inspector GUI Name Type,就是最初在Inspector视图下我们看到的信息,可以稍微修改查看效果;第三个是Property的类型,Unity支持的类型如下;第四个是默认值,细心的可以发现部分比如2D,Rect,Cube还要再加个{};作为Properties的内容以上四部分缺一不可
    Property类型支持.png

欲知后事如何,且听下回分解

上一篇 下一篇

猜你喜欢

热点阅读