0507 쉐이더 Diffuse Wraping

2021. 5. 7. 16:24unity/쉐이더

이 쉐이더를 쓰려면 ramp texture가 따로 필요하다. 그냥 구글에서 아무 이미지나 다운 받아서 쓰기.

빛 공식으로 쓰이는 노멀과 라이트 벡터의 내적을 uv로 사용한다.

해당 수치를 조정해보면 집어넣은 텍스쳐 중 어느 컬러를 뽑아오는 지 알 수 있다. (0.1, 0.1)을 넣으면 가장 처음 컬러인 베이지를 뽑아온다.
(0.5, 0.5)를 넣으니 절반인 라벤더 색이 나온다.

저 uv색 대신 ndotl을 넣으면 

이미지의 밝기를 넣은 텍스쳐의 색으로 나타내진다.
텍스쳐와 노말맵까지 입혔을 때

Shader "Custom/DiffuseWarp"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RampTex("Ramp", 2D) = "white" {}
        _BumpMap("Normal Map",2D) = "bump"{}

    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf _Warp noambient

        #pragma target 3.0

        sampler2D _MainTex;
        sampler2D _RampTex;
        sampler2D _BumpMap;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpMap;
        };


        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 Lighting_Warp(SurfaceOutput s, float3 lightDir, float atten) 
        {
            float ndotl = dot(s.Normal, lightDir)*0.5+0.5;

            float4 ramp = tex2D(_RampTex, float2(ndotl,1));

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

 

스펙큘러까지 적용

float4 Lighting_Warp(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten) 
        {
            float ndotl = dot(s.Normal, lightDir)*0.5+0.5;
            
            float H = normalize(lightDir + viewDir);
            float spec = saturate(dot(s.Normal,H));

            float4 ramp = tex2D(_RampTex, float2(ndotl,spec));

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

uv 값을 u=ndotl, v=spec으로 주었다.
흰색으로 라이트가 표시된다. 이미지 상으론 잘 안 보이지만...

'unity > 쉐이더' 카테고리의 다른 글

0510 Alpha Blending  (0) 2021.05.10
0507 쉐이더 Cube Map+메터리얼에 배경 반사하기  (0) 2021.05.07
0507 쉐이더 툰 그래픽 만들기  (0) 2021.05.07
0506 쉐이더 블린퐁  (0) 2021.05.06
0506 쉐이더 Rim Light + Hologram  (0) 2021.05.06