๋ฌผ์ฒด์ ํ๋ฉด์ ์ค์นด์ด๋งต์ด ๋ฐ์ฌ๋ ๋ชจ์ต์ ํํํฉ๋๋ค.
// 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
}
}
}๋ฌผ์ฒด์ ํ๋ฉด์ ๋ฐ์ฌ๋ฅผ ํํํ๊ธฐ ์ํด์๋ ๋ฌผ์ฒด ์ฃผ๋ณ์ ๋ชจ๋ ๋ฐฉํฅ์ ๋ํด์ ๋ฐ์ฌ๋๋ ๋ถ๋ถ์ ๊ตฌํด์ผ ํฉ๋๋ค.
๋ฐ์ฌ ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์๋ ์ขํ์์ ์์น์ ๋ ธ๋ง ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ณ , ์นด๋ฉ๋ผ ์์น์์ ์ค๋ธ์ ํธ๋ฅผ ํฅํ๋ ๋ฒกํฐ์ ๋ ธ๋ง ๋ฒกํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ฌ ๋ฒกํฐ๋ฅผ ๊ตฌํฉ๋๋ค.
// ์๋ ์ขํ์์ ์์น
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(i, n) : ์
์ฌ ๊ด์ ๊ณผ ํ๋ฉด ๋ฒ์ ์ ์ฌ์ฉํ์ฌ ๋ฐ์ฌ ๋ฒกํฐ๋ฅผ ๋ฐํ
i : ์
์ฌ๊ด์ ๋ฐฉํฅ ๋ฒกํฐ
n : ๋ฐ์ฌ๋ฉด์ ํ๋ฉด ๋ฒ์
reflect() ํจ์๋ HLSL ํจ์๋ก์์ ํจ์๋ก ๋ฐ์ฌ ๋ฒกํฐ๋ฅผ ๊ตฌํ ๋ค ํด๋น ๋ฒกํฐ๋ฅผ ์ค์นด์ด๋งต์ ํ ์ ์ ์ป์ด์ค๋ ์ขํ๋ก ์ฌ์ฉํฉ๋๋ค.
๋ฐ์ฌ๋ฒกํฐ๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ์ค๋ช ํด๋ณด๊ฒ ์ต๋๋ค.
๋น์ด ๋ฌผ์ฒด์ ๋๋ฌํ์ ๋, ์ฆ ์ ์ฌ๊ด์ ๋ฒกํฐ V๋ผ ํ๊ณ ๋ฌผ์ฒด์ ๋ฒ์ ๋ฒกํฐ๋ฅผ n์ด๋ผ๊ณ ํฉ๋๋ค.
๋ฐ์ฌ ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ธฐ ์ํด ์ฒซ ๊ณผ์ ์ผ๋ก V ๋ฒกํฐ์ ๋ฐฉํฅ์ ๋ฐ๊ฟ์ค๋๋ค.
-V์ ๋ฌผ์ฒด์ ๋ฒ์ ๋ฒกํฐ์ธ n์ ๋ด์ ํฉ๋๋ค. ๋ด์ ์ ๊ฒฐ๊ณผ๋ก ์ค์นผ๋ผ๊ฐ์ด ๋์ต๋๋ค.
๋ด์ ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฒ์ ๋ฒกํฐ n์ 2๋ฐฐํ์ฌ ๊ณฑํด์ค๋๋ค. ์ด ๋ n์ 2๋ฅผ ๊ณฑํ๋ ์ด์ ๋ ๊ณฑํ์ง ์์๊ฒฝ์ฐ ์ง๋ฉด๊ณผ ํํํ ๋ฒกํฐ๊ฐ ๋์ค๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๊ทธ๋ฆผ์ ๊ฒฐ๊ณผ๊ฐ์ ์ต์ด ์ ์ฌ๊ด ๋ฒกํฐ์ธ V๋ฅผ ๋ํ์ฌ ๋ฐ์ฌ๋ฒกํฐ๋ฅผ ๊ตฌํฉ๋๋ค.
๋ฒกํฐ์ ์ฑ์ง์ ์ํด ํฌ๊ธฐ์ ๋ฐฉํฅ์ด ๊ฐ์ผ๋ ์ด๋์ ์๋์ง ๊ฒฐ๊ตญ์ ๋๊ฐ์ ๋ฒกํฐ์ ๋๋ค.
V : ์ ์ฌ๊ด์ ๋ฒกํฐ, R : ๋ฐ์ฌ ๋ฒกํฐ, n : ๋ฒ์ ๋ฒกํฐ
๋ฐ์ฌ ๋ฒกํฐ๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ๋จผ์ ๋ฒกํฐ์ ํฌ์์ ๋ํด์ ์์์ผ ํฉ๋๋ค.
์ด๋ค ๋ฒกํฐ V ๋ฅผ ๋จ์ ๋ฒกํฐ n์ ๋ด์ ํ์ฌ V์ n ๋ฐฉํฅ์ผ๋ก์ ๊ธธ์ด๋ฅผ ๊ตฌํ๋๊ฒ์ ๋ปํฉ๋๋ค.
๋ด์ ๊ฐ์ ์ค์นผ๋ผ์ด๋ฏ๋ก ํฌ์๋ ๋ฐฉํฅ์ผ๋ก์ ๋ฒกํฐ๋ฅผ ๊ตฌํ๋ ค๋ฉด ๋ด์ ๊ฐ์ ๋ฐฉํฅ๋ฒกํฐ n ์ ๊ณฑํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ด ํฌ์ ๋ฒกํฐ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ฌ๋ฒกํฐ๋ฅผ ๊ตฌํ๋๋ฐ ์ฐ์ ๋๋ค.