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

[Unity/Shader] 파트15-1 : Cubemap 적용

by Minkyu Lee 2023. 8. 22.

Cubemap이란?

Cubemap은 일종의 텍스쳐다.

텍스쳐 한 장으로 사방향을 모두 표현하는 특수한 텍스쳐다.

 

환경 텍스쳐를 이용해 반사를 표현한다.

1. 주변 이미지를 텍스쳐로 만든다.

2. 이를 오브젝트에 씌운다.

 

Ambient Cube

Cubemap은 반사 표현시도 쓰이지만,

Ambient Color(환경광)기능을 개선하기 위해서도 사용한다.

큐브맵 사이즈를 극도로 줄인다.

이걸 입혀 산란광을 표현한다.

이를 Ambient Cube라고 부른다.

이렇게 이미지를 이용해 조명 표현하는 방식을 IBL (Image Based Lighting)이라고 한다.

 

코드

Shader "Custom/part16-1"
{
    Properties
    {
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Cube ("Cubemap", Cube) = ""{}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
        #pragma surface surf Lambert noambient
        #pragma target 3.0

        sampler2D _MainTex;
        samplerCUBE _Cube;

        struct Input
        {
            float2 uv_MainTex;
            float3 worldRefl; // 반사 벡터 받기.
        };

        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);
            float4 re = texCUBE(_Cube, IN.worldRefl); // 반사 벡터를 UV로 사용한다.
            o.Albedo = 0; // 반사 100%로 만들기 위해 0으로 한다. 빈사 50%원하면 *0.5 하고 Emission에도 0.5를 넣어주면 될 것이다.
            o.Emission = re.rgb; // Emission에 넣는다. 반사란 주변 이미지를 받아 그대로 비추는 것이기 때문이다.
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

 

댓글