Unity/그래픽스프로그래밍

0506 _ RIM 라이트 표현하기

minquu 2021. 5. 6. 15:35
반응형

RIM 라이트 (겉에 붙는 라이트)
반사율을 적용하는 공식 Franel 공식

 

---

 

먼저 한장만 받는 걸 만들고. 환경광을 없애준다

 

 

라이트는 스탠다드가 아닌 램버트로 바꾸고 알베도를 0으로 해서 검정색으로 만든다

 

 

 

 

---

Input 구조체에 ViewDir 바라 보는 방향

 

Unity - Manual: Writing Surface Shaders (unity3d.com)

 

Unity - Manual: Writing Surface Shaders

Vertex and fragment shader examples for the Built-in Render Pipeline Surface Shaders and rendering paths Writing Surface Shaders In the Built-in Render Pipelne, Surface Shaders are a streamlined way of writing shadersA program that runs on the GPU. More in

docs.unity3d.com

 

 

 

카메라 벡터라고도 부르고, 뷰벡터라고도 부른다.

 

카메라 벡터로 실제로 연상될때는 반대로 나온다. 라이트처럼 (연산할때 편하기 위해서)

 

viewDir 는 IN 에 있는 것 

★float3 viewDir;

플롯 3로 받기 ! 

 

pow는 제곱이라는 뜻 

 

 

--

 

 

rim 도 dot 연산을 해줘야한다.

 

1 - rim (림이 반대로 나와서 1- 해서 반전 시킴)

 

핵심 RIM 공식은 이것임

 

float rim = dot(o.Normal, IN.viewDir);

 

림이 약해보여서 

 

제곱을 해준다. 

 

            o.Emission = pow (1 - rim, 3);.
            

 

---- 

색을 조절할 수 있게 해보자

 

프로퍼티를 뚫어서 값을 변화할 수 있게 한다.

 

 

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _RimColor ("Color", Color) = (1,1,1,1)
        _RimPow("Pow", Range(1,10)) = 1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert noambient
        #pragma target 3.0

        sampler2D _MainTex;
        float4 _RimColor;
        float _RimPow;

        struct Input
        {
            float2 uv_MainTex;
            float3 viewDir;

        };
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            o.Albedo = 0;

            float rim = dot(o.Normal, IN.viewDir);
            o.Emission = pow(1- rim, _RimPow) * _RimColor.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 

  o.Emission = pow(1- rim, _RimPow) * _RimColor.rgb;

컬러와 파워를 넣어준다.

 

 

 

 

 

----

 

나머지 맵을 넣어준다.

 

Shader "Custom/Test"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Normal ("Normal", 2D) = "white" {}
        _RimColor ("Color", Color) = (1,1,1,1)
        _RimPow("Pow", Range(1,10)) = 1
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert

        sampler2D _MainTex;
        float4 _RimColor;
        float _RimPow;
        sampler2D _Normal;

        struct Input
        {
            float2 uv_MainTex;
            float2 uv_Normal;
            float3 viewDir;

        };
        void surf (Input IN, inout SurfaceOutput o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            fixed3 n = UnpackNormal(tex2D (_Normal, IN.uv_Normal));
            o.Albedo = c.rgb;
            o.Normal = n;

            float rim = saturate (dot(o.Normal, IN.viewDir));
            o.Emission = pow(1- rim, _RimPow) * _RimColor.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

 

 

 

 

 

---

게임에서 사용하는 예시 

발로란트

 

 

 

 

 

 

반응형