스토리지

[5.6] Rim Light - 역광 본문

Unity/Shader

[5.6] Rim Light - 역광

ljw4104 2021. 5. 6. 15:02

Unity의 역광은 프레넬 방정식을 이용하였다.

ko.wikipedia.org/wiki/%ED%94%84%EB%A0%88%EB%84%AC_%EB%B0%A9%EC%A0%95%EC%8B%9D

 

프레넬 방정식 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 프레넬 방정식(Fresnel equations) 또는 프레넬 공식(Fresnel's formulas)은 반사계수와 투과계수에 관한것으로 한 매질과 광학적 특성 즉, 굴절률이 다른 매질의 계면에

ko.wikipedia.org

프레넬 방정식(Fresnel equations) 또는 프레넬 공식(Fresnel's formulas)은 반사계수와 투과계수에 관한것으로 한 매질과 광학적 특성 즉, 굴절률이 다른 매질의 계면에서 반사 또는 투과 진폭을 입사진폭으로 나눈 값을 말한다.

 

배율이 1배 / 2배

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

        CGPROGRAM
        #pragma surface surf Lambert noambient

        sampler2D _MainTex;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;         //바라보는 방향, View Vector, Camera Vector
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = 0;
            
            float rim = dot(IN.viewDir, o.Normal);
            o.Emission = pow(1 - rim, 2);
        }
        ENDCG
    }
    FallBack "Diffuse"
}
  • rim이라는 변수를 선언하고 카메라가 보는 방향과 표면 벡터의 내적값을 구한다.
  • 내적값을 Emission 속성에 넣는다.
  • 1배일때 연하기 때문에 제곱을 해준다.

 

역광의 색상 추가 및 강도 조절

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimColor ("Color", Color) = (1,1,1,1)
        _RimPower ("Rim Power", Range(1,10)) = 1
        _BumpTex ("Albedo (RGB)", 2D) = "bump" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Lambert noambient

        sampler2D _MainTex;
        sampler2D _BumpTex;
        float4 _RimColor;
        float _RimPower;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_BumpTex;
            float3 viewDir;         //바라보는 방향, View Vector, Camera Vector
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            fixed4 n = tex2D (_BumpTex, IN.uv_BumpTex);
            o.Albedo = c.rgb;
            o.Normal = UnpackNormal(n);
            
            float rim = saturate(dot(o.Normal, IN.viewDir));
            o.Emission = pow(1 - rim, _RimPower) * _RimColor.rgb;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

RGB(255,0,0) 세기 : 4.6  /  RGB(0,0,255) 세기 : 7.6  /  기존 텍스쳐(Emission) 및 Normal 텍스쳐 삽입

'Unity > Shader' 카테고리의 다른 글

[5.6] 홀로그램 2  (0) 2021.05.06
[5.6] 홀로그램 만들기  (0) 2021.05.06
[5.6] Light 연산 연습  (0) 2021.05.06
[5.6] Light 연산 정리  (0) 2021.05.06
[5.6] Light 연산 (Lambert, Half-Lambert)  (0) 2021.05.06
Comments