[Unity 5.xShaders]Diffuse Shader

作者: 霸俊流年 | 来源:发表于2016-12-22 22:12 被阅读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
    • 操作第3步的参数标识了surf中调用的参数,需得与上面Properties中定义的一致,否则不能识别
    • 操作第4步是Properties中参数的具体函数调用,细心的可以发现我们使用了pow函数,这是一个指数函数,具体有哪些函数可以使用的,可以参考链接http://http.developer.nvidia.com/CgTutorial/cg_tutorial_appendix_e.html 不在surf内操作的Properties属性是不会起到作用的

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

    相关文章

      网友评论

      • 耀先锋:第3步里的slidervalue定义是不是错了呀…
        耀先锋:@霸俊流年 不好意思,我没有实际跑代码。只是觉得slidervalue本来在property中是一个float型,怎么到了cg代码里面成了float4。这样做有什么好处吗?
        霸俊流年:@耀先锋 怎么 有报什么错
        霸俊流年:@耀先锋 我在unity5.3.6f1实际有打出来,没错啊

      本文标题:[Unity 5.xShaders]Diffuse Shader

      本文链接:https://www.haomeiwen.com/subject/qmehvttx.html