unity3d shader 自定義光照函數


希望實現一個根據攝像機朝向與網格法向關系控制光照亮度的雙面shader。

代碼如下

Shader "Custom/UnlitOP" {
    Properties{ 
        _Color("Main Color", Color) = (1,1,1,1)                  //渲染需要外部設置的顏色
        _MainTex("Base (RGB)", 2D) = "white" {}                  //材質
        _CamDir("Camera Dirction",Vector) = (0.1,0.2,0.3,0.4)          //攝像機的朝向

    }
        SubShader{
        Tags{ "RenderType" = "Opaque" "Queue" = "Geometry"}
        ZWrite On  
        LOD 200
        Cull Off            //雙面shader
        CGPROGRAM
#pragma surface surf myLightModel    //用了自定義的光照模型



    sampler2D _MainTex;          
    float4 _Color;
    float4 _CamDir;            //攝像機朝向變量
    //命名規則:Lighting接#pragma suface之后起的名字   
    //lightDir :點到光源的單位向量   viewDir:點到攝像機的單位向量   atten:衰減系數   
    float4 LightingmyLightModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten)
    {
        float4 c;
        float3 cr;
        cr = _CamDir.xyz;

        float diffuseF = max(0, abs(dot(s.Normal, cr)/2.0));    //由於是雙面shader,所以正反面的顏色應該一樣,否則會不同,/2是讓dot結果在0-1之間。
        
        c.rgb = s.Albedo*_LightColor0.rgb*(diffuseF);        //_LightColor0是內置的屬性,應該跟當前光照有關。
        c.a = s.Alpha;
        return c;
    }

    struct Input {
        float2 uv_MainTex;
        float4 _Color;
    };

    void surf(Input IN, inout SurfaceOutput o) {
        //half4 c = tex2D(_MainTex, IN.uv_MainTex)*_Color;
        o.Albedo = _Color.rgb;
        o.Alpha = _Color.a;
    }
    ENDCG
    }
        FallBack "Diffuse"
}

下面是有透明效果的版本,基本一樣,就是要注意Tags的寫法,以及關閉ZWrite,開啟Ztest,使用Blend。另外在調試中發生了一點意外,完全一樣的代碼,開始時始終透明物體被渲在了所有不透明物體后面,怎么改代碼都沒用,后來將材質的shader都改成standard試試好用,再改回來就正常了。這點事弄了半下午...... 

Shader "Custom/UnlitTR" {
    Properties{
        _Color("Main Color", Color) = (1,1,1,1)
        _MainTex("Base (RGB)", 2D) = "white" {}
    _CamDir("Camera Dirction",Vector) = (0.1,0.2,0.3,0.4)

    }
        SubShader{
        Tags{ "RenderType" = "Transparent" "Queue" = "Transparent" }
        ZWrite Off
        ZTest On
        LOD 200
        Blend SrcAlpha OneMinusSrcAlpha
        CGPROGRAM
#pragma surface surf myLightModel alpha  



    sampler2D _MainTex;
    float4 _Color;
    float4 _CamDir;

    //命名規則:Lighting接#pragma suface之后起的名字   
    //lightDir :點到光源的單位向量   viewDir:點到攝像機的單位向量   atten:衰減系數   
    float4 LightingmyLightModel(SurfaceOutput s, float3 lightDir, half3 viewDir, half atten)
    {

        float4 c;
        float3 cr;
        cr = _CamDir.xyz;
        float diffuseF = max(0, abs(dot(s.Normal, cr) / 2.0));
        c.rgb = s.Albedo*_LightColor0.rgb*(diffuseF);
        c.a = s.Alpha;
        return c;
    }

    struct Input {
        float2 uv_MainTex;
        float4 _Color;
    };

    void surf(Input IN, inout SurfaceOutput o) {
        //half4 c = tex2D(_MainTex, IN.uv_MainTex)*_Color;
        o.Albedo = _Color.rgb;
        o.Alpha = _Color.a;
    }
    ENDCG
    }
        FallBack "Diffuse"
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM