0504 쉐이더 커스텀 라이트 Lambert, BlinnPhong, Standard

2021. 5. 4. 16:46unity/쉐이더

램버트 : 스페큘러 공식이 없고, 밝고 어두움만 표현된다.
가볍고 저사양 기계에서도 잘 돌아간다.

더보기
Shader "Custom/lambert"
{
    Properties
    {        
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        
        #pragma surface surf Lambert


        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };


        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) ;
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
//SurfaceOutput에서 받는 요소들
여기서 램버트는 스페큘러를 받지 않는다.
struct SurfaceOutput
{
    fixed3 Albedo;  // diffuse color
    fixed3 Normal;  // tangent space normal, if written
    fixed3 Emission;
    half Specular;  // specular power in 0..1 range
    fixed Gloss;    // specular intensity
    fixed Alpha;    // alpha for transparencies
};

 

블린퐁: 스페큘러의 계산을 더 단순화한 구조
보는 각도와 조명 각도에 따라 계산된 특정 색의 라이트를 원으로 표시 함

더보기
Shader "Custom/blinnphong"
{
    Properties
    {

        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _SpecColor("Specular Color",Color)=(1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM

        #pragma surface surf BlinnPhong


        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Gloss = 1.0;
            o.Specular = 0.5;

            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

o.Specular 값이 1에 가까울 수록 빛의 세기가 낮아진다. (0~1)

//SurfaceOutput에서 받는 요소들
블린퐁은 스페큘러를 받는다.
struct SurfaceOutput
{
    fixed3 Albedo;  // diffuse color
    fixed3 Normal;  // tangent space normal, if written
    fixed3 Emission;
    half Specular;  // specular power in 0..1 range
    fixed Gloss;    // specular intensity
    fixed Alpha;    // alpha for transparencies
};

 

스탠다드 : 물리 기반 쉐이터, 주변 환경을 반사해서 스페큘러 표현

더보기
Shader "Custom/standard"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        
        #pragma surface surf Standard

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}
struct SurfaceOutputStandard
{
    fixed3 Albedo;      // base (diffuse or specular) color
    fixed3 Normal;      // tangent space normal, if written
    half3 Emission;
    half Metallic;      // 0=non-metal, 1=metal
    half Smoothness;    // 0=rough, 1=smooth
    half Occlusion;     // occlusion (default 1)
    fixed Alpha;        // alpha for transparencies
};

 

텍스쳐만 넣은 상태
노말 맵 추가