Unity/수업내용

Unity Shader 21.05.07. 수업내용 - Cube Map

HappyFrog 2021. 5. 7. 18:24

developer.playcanvas.com // wiki

가슴부위에 잘 보이는데, 잘 반사가 되고있다.

Cube텍스쳐는 samplerCUBE타입이며, worldRefl는 Input구조체의 기능이다. 또한, texCUBE는 texCUBE(큐브, float3)형식을 받는다. 그리고 Emission과 Albedo를 같이사용하여 더 밝게 출력된다.

 

알베도를 0으로 할당하고 범프맵까지 적용하니 반사도 잘 되고 텍스쳐도 잘 표현됐다.

 

Emission = Normal // worldNormal // worldNormalVector

나는 왜 가운데 출력값이 까맣게 나오는지 모르겠다

맨 오른쪽은 월드노멀벡터로 직접 입력한 값

Shader "Custom/CubeMap"
{
    Properties
    {       
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _BumpTex ("BumpTexture", 2D) = "bump" {}
        _Cube ("CubeMap", Cube) = "" {}
        _Emission ("EmissionCoef", Float) = 0
        _Albedo ("AlbedoCoef", Float) = 0
       
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM
       
        #pragma surface surf Lambert 

        sampler2D _BumpTex;
        sampler2D _MainTex;
        samplerCUBE _Cube;

        float _Emission;
        float _Albedo;

        struct Input
        {
            float2 uv_BumpTex;
            float2 uv_MainTex;
            float3 worldRefl;
            float3 worldNormal;
            INTERNAL_DATA
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            o.Normal = UnpackNormal(tex2D(_BumpTex, IN.uv_BumpTex));

            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            float4 refl = texCUBE(_Cube, WorldReflectionVector(IN, o.Normal));

            o.Albedo = c.rgb * _Albedo;
            //o.Emission = IN.worldNormal;
            float3 worldNormal = WorldReflectionVector(IN, o.Normal);
            o.Emission = refl.rgb * _Emission;
            o.Alpha = c.a;
        }
        
        ENDCG
    }
    FallBack "Diffuse"
}

 

texCUBE // Nvidia api
오늘도 만나는 인풋 구조체 // Unity manual