Skip to content

Latest commit

ย 

History

History
141 lines (99 loc) ยท 4.88 KB

File metadata and controls

141 lines (99 loc) ยท 4.88 KB

Abstract

๋ฌผ์ฒด์˜ ํ‘œ๋ฉด์— ์Šค์นด์ด๋งต์ด ๋ฐ˜์‚ฌ๋œ ๋ชจ์Šต์„ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

Shader

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'

Shader "UnityShaderTutorial/skymap_reflect" {
    SubShader
    {
        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct v2f {
                half3 worldRefl : TEXCOORD0;
                float4 pos : SV_POSITION;
            };

            v2f vert (float4 vertex : POSITION, float3 normal : NORMAL)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(vertex);
                // compute world space position of the vertex
                float3 worldPos = mul(unity_ObjectToWorld, vertex).xyz;
                // compute world space view direction
                float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
                // world space normal
                float3 worldNormal = UnityObjectToWorldNormal(normal);
                // world space reflection vector
                o.worldRefl = reflect(-worldViewDir, worldNormal);
                return o;
            }
        
            fixed4 frag (v2f i) : SV_Target
            {
                // sample the default reflection cubemap, using the reflection vector
                half4 skyData = UNITY_SAMPLE_TEXCUBE(unity_SpecCube0, i.worldRefl);
                // decode cubemap data into actual color
                half3 skyColor = DecodeHDR (skyData, unity_SpecCube0_HDR);
                // output it!
                fixed4 c = 0;
                c.rgb = skyColor;
                return c;
            }
            ENDCG
        }
    }
}

Description

๋ฌผ์ฒด์˜ ํ‘œ๋ฉด์— ๋ฐ˜์‚ฌ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฌผ์ฒด ์ฃผ๋ณ€์˜ ๋ชจ๋“  ๋ฐฉํ–ฅ์— ๋Œ€ํ•ด์„œ ๋ฐ˜์‚ฌ๋˜๋Š” ๋ถ€๋ถ„์„ ๊ตฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์›”๋“œ ์ขŒํ‘œ์ƒ์˜ ์œ„์น˜์™€ ๋…ธ๋ง ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๊ณ , ์นด๋ฉ”๋ผ ์œ„์น˜์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ–ฅํ•˜๋Š” ๋ฒกํ„ฐ์™€ ๋…ธ๋ง ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

// ์›”๋“œ ์ขŒํ‘œ์ƒ์˜ ์œ„์น˜
float3 worldPos = mul(unity_ObjectToWorld, vertex).xyz;
// ์นด๋ฉ”๋ผ ์œ„์น˜์—์„œ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ํ–ฅํ•˜๋Š” ๋ฐฉํ–ฅ ๋ฒกํ„ฐ
float3 worldViewDir = normalize(UnityWorldSpaceViewDir(worldPos));
// ์›”๋“œ ์ขŒํ‘œ์ƒ์˜ ๋…ธ๋ง ๋ฒกํ„ฐ
float3 worldNormal = UnityObjectToWorldNormal(normal);
// ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ
o.worldRefl = reflect(-worldViewDir, worldNormal);

์œ ๋‹ˆํ‹ฐ์—์„œ๋Š” ์”ฌ์—์„œ ๋ฐ˜์‚ฌ ์†Œ์Šค๋กœ ์Šค์นด์ด๋ฐ•์Šค(์Šค์นด์ด๋งต)๊ฐ€ ์‚ฌ์šฉ๋  ๋•Œ ์ด ์Šค์นด์ด๋ฐ•์Šค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋””ํดํŠธ ๋ฐ˜์‚ฌ ํ…์Šค์ณ(๋ฐ˜์‚ฌ ํ”„๋กœ๋ธŒ)๊ฐ€ ๋ฐ˜๋“œ์‹œ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๋ฅผ ์‚ฌ์ „ ์ •์˜ ํ•ด๋†“์•˜์Šต๋‹ˆ๋‹ค.

unity_SpecCube0 : ์‚ฌ์šฉ์ค‘์ธ ๋ฐ˜์‚ฌ ํ”„๋กœ๋ธŒ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ํ๋ธŒ๋งต

UNITY_SAMPLE_TEXCUBE ๋ผ๋Š” ๋นŒํŠธ์ธ ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…์…€์„ ์–ป์–ด์˜ค๊ณ , ํ๋ธŒ๋งต์—๋Š” HDR ์ƒ‰์ƒ์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— HDR ํ˜•์‹์—์„œ RGB ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Reflect

reflect(i, n) : ์ž…์‚ฌ ๊ด‘์„ ๊ณผ ํ‘œ๋ฉด ๋ฒ•์„ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๋ฐ˜ํ™˜

i : ์ž…์‚ฌ๊ด‘์˜ ๋ฐฉํ–ฅ ๋ฒกํ„ฐ
n : ๋ฐ˜์‚ฌ๋ฉด์˜ ํ‘œ๋ฉด ๋ฒ•์„ 

reflect() ํ•จ์ˆ˜๋Š” HLSL ํ•จ์ˆ˜๋กœ์œ„์˜ ํ•จ์ˆ˜๋กœ ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•œ ๋’ค ํ•ด๋‹น ๋ฒกํ„ฐ๋ฅผ ์Šค์นด์ด๋งต์˜ ํ…์…€์„ ์–ป์–ด์˜ค๋Š” ์ขŒํ‘œ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‚ฌ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์„ ๊ทธ๋ฆผ์œผ๋กœ ์„ค๋ช…ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋น›์ด ๋ฌผ์ฒด์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ, ์ฆ‰ ์ž…์‚ฌ๊ด‘์„ ๋ฒกํ„ฐ V๋ผ ํ•˜๊ณ  ๋ฌผ์ฒด์˜ ๋ฒ•์„ ๋ฒกํ„ฐ๋ฅผ n์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด ์ฒซ ๊ณผ์ •์œผ๋กœ V ๋ฒกํ„ฐ์˜ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

-V์™€ ๋ฌผ์ฒด์˜ ๋ฒ•์„ ๋ฒกํ„ฐ์ธ n์„ ๋‚ด์ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด์ ์˜ ๊ฒฐ๊ณผ๋กœ ์Šค์นผ๋ผ๊ฐ’์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

๋‚ด์ ์˜ ๊ฒฐ๊ณผ๊ฐ’์— ๋ฒ•์„ ๋ฒกํ„ฐ n์„ 2๋ฐฐํ•˜์—ฌ ๊ณฑํ•ด์ค๋‹ˆ๋‹ค. ์ด ๋•Œ n์— 2๋ฅผ ๊ณฑํ•˜๋Š” ์ด์œ ๋Š” ๊ณฑํ•˜์ง€ ์•Š์„๊ฒฝ์šฐ ์ง€๋ฉด๊ณผ ํ‰ํ–‰ํ•œ ๋ฒกํ„ฐ๊ฐ€ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์œ„ ๊ทธ๋ฆผ์˜ ๊ฒฐ๊ณผ๊ฐ’์— ์ตœ์ดˆ ์ž…์‚ฌ๊ด‘ ๋ฒกํ„ฐ์ธ V๋ฅผ ๋”ํ•˜์—ฌ ๋ฐ˜์‚ฌ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•ฉ๋‹ˆ๋‹ค.

๋ฒกํ„ฐ์˜ ์„ฑ์งˆ์— ์˜ํ•ด ํฌ๊ธฐ์™€ ๋ฐฉํ–ฅ์ด ๊ฐ™์œผ๋‹ˆ ์–ด๋””์— ์žˆ๋˜์ง€ ๊ฒฐ๊ตญ์—” ๋˜‘๊ฐ™์€ ๋ฒกํ„ฐ์ž…๋‹ˆ๋‹ค.

V : ์ž…์‚ฌ๊ด‘์˜ ๋ฒกํ„ฐ, R : ๋ฐ˜์‚ฌ ๋ฒกํ„ฐ, n : ๋ฒ•์„  ๋ฒกํ„ฐ

Prerequisites

ํˆฌ์˜ ๋ฒกํ„ฐ

๋ฐ˜์‚ฌ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋จผ์ € ๋ฒกํ„ฐ์˜ ํˆฌ์˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํˆฌ์˜

์–ด๋–ค ๋ฒกํ„ฐ V ๋ฅผ ๋‹จ์œ„ ๋ฒกํ„ฐ n์— ๋‚ด์ ํ•˜์—ฌ V์˜ n ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•˜๋Š”๊ฒƒ์„ ๋œปํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์ ๊ฐ’์€ ์Šค์นผ๋ผ์ด๋ฏ€๋กœ ํˆฌ์˜๋œ ๋ฐฉํ–ฅ์œผ๋กœ์˜ ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ๋‚ด์ ๊ฐ’์— ๋ฐฉํ–ฅ๋ฒกํ„ฐ n ์„ ๊ณฑํ•ด์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด ํˆฌ์˜ ๋ฒกํ„ฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐ˜์‚ฌ๋ฒกํ„ฐ๋ฅผ ๊ตฌํ•˜๋Š”๋ฐ ์“ฐ์ž…๋‹ˆ๋‹ค.