Notice
Recent Posts
Recent Comments
Link
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Archives
Today
Total
관리 메뉴

행복한 개구리

Unity Shader 21.05.07. 수업내용 - 빛효과 단계별 적용 본문

Unity/수업내용

Unity Shader 21.05.07. 수업내용 - 빛효과 단계별 적용

HappyFrog 2021. 5. 7. 15:17

데셍
머리쪽을 보면 경계가 보이는 것을 볼 수 있다. 곱하고 나눈 값 : 10 // 5

빛 효과를 그라데이션이 아닌 데셍처럼 적용을 시켜 뚜렷하게 만드는 코드이다.

if문을 사용하여 나누어도 되지만 그러면 코드양이 너무 많아지기때문에 ceil을 사용하는 것을 권장한다.

ndotl에 곱해지는 수나 ceil(ndotl)을 나누는 값이 커질수록 그라데이션에 가깝게 출력된다.

 

 

위에서 오른쪽 사진은 외곽선이 존재하는데, 이 전에 했던 내용 그대로 적용했다.

 

1pack은 이렇게 vertex를 사용하여 외곽선을 표현하고 색깔은 지정값을 부여했다.

ceil은 소숫점처리를 해주는 CG의 기능이다.

 

============================================================================

1pack을 쓰고도 외곽선을 잡는게 가능하다.

 

rim의 반전을 이용하듯이 rim이 일정수치 이하로 내려갈 시 외곽선을 지정하여 외곽선을 만들 수 있다.

게다가 rim은 표면벡터와 시선벡터의 내각이기때문에 가능하다. 하지만 2pack으로 만든 것보다는 조금 허술한 느낌은 확실히 든다.

 

외곽선이 조금 각져있는 모양을 띈다.

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

        CGPROGRAM
        #pragma surface surf Toon noambient
           
        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;
        }

        float4 LightingToon(SurfaceOutput s, float3 lightDir, float3 viewDir, float atten)
        {
            float ndotl = dot(s.Normal, lightDir) * 0.5 + 0.5;

            //half-Lambert
            ndotl *= 10;
            ndotl = ceil(ndotl)/10;

            //rim
            float rim = abs(dot(s.Normal, viewDir));
            if(rim > 0.2)
            {
                rim = 1;
            }
            else
            {
                rim = -1;
            }

            //half-Vector
            float3 hVec = normalize(lightDir + viewDir);
            float spec = dot(hVec, s.Normal);


            float4 final;
            final.rgb = s.Albedo * rim;
            final.a = s.Alpha;

            return final;
        }

        ENDCG
    }
    FallBack "Diffuse"
}

 

============================================================================

rim을 넣었을 때의 결과
그리고 1pack 외곽선을 처리했을때의 결과. 여전히 각진 선들이 표현된다.

============================================================================