본문 바로가기
셰이더 (Shader)/유니티 쉐이더 스타트업 - 정종필

[Unity/Shader] 파트14-8 : Diffuse Wraping 기법 응용

by Minkyu Lee 2023. 8. 22.

라이트벡터와의 내적은 x축으로 사용한다. (디퓨즈로 표현)

뷰벡터와의 내적은 y축으로 사용한다. (스펙큘러로 표현)

 

추가정보

도타2 창작마당의 쉐이더 가이드에 여러 응용법들이 있다.

라이트벡터와의 내적이 아닌, Normal.x 또는 viewDir.y 등을 사용하여 재밌는 표현이 가능하다.

 

텍스쳐 세팅

텍스쳐의 y축에 스펙큘러 색인 흰, 검을 할당하였다.

툰이므로 단절되게 할당하였다.

 

코드

 
Shader "Custom/part14-7"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpMap ("NormalMap", 2D) = "bump" {}
        _RampTex ("RampTex", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf warp noambient
        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _BumpMap;
        sampler2D _RampTex;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };

        UNITY_INSTANCING_BUFFER_START(Props)
            // put more per-instance properties here
        UNITY_INSTANCING_BUFFER_END(Props)

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap));
            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }

        float4 Lightingwarp(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
        {
            float rim = abs(dot(s.Normal, viewDir)); // 스펙큘러 표현용
            float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5;
            float4 ramp = tex2D(_RampTex, float2(ndotl, rim)); // y축에 넣는다.

            float4 final;
            final.rgb = s.Albedo.rgb * ramp.rgb;
            final.a = s.Alpha;
            return final;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

댓글