Surface Shader
๐ซ Surface Shader
- ์ค์ ๋ถ๋ถ ์ ์ฒ๋ฆฌ๋ผ๊ณ ํ ์๋ ์๊ณ ์ค๋ํ(snippet)์ด๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ ํฉ๋๋ค. ์ด ๋ถ๋ถ์ ๋ง ๊ทธ๋๋ก ์์ด๋์ ์กฐ๋ช ๊ณ์ฐ ์ค์ ์ด๋, ๊ธฐํ ์ธ๋ถ์ ์ด ๋ถ๊ธฐ๋ฅผ ์ ํด์ฃผ๋ ๋ถ๋ถ์ ๋๋ค.
float์ 1/2 ํฌ๊ธฐ๊ฐ half half๋ณด๋ค ๋ ์์ ํฌ๊ธฐ๊ฐ fixed
์ปฌ๋ฌ๋ ๋ฒกํฐ ๊ธธ์ด๋ fixed๋ก ์ถฉ๋ถ ๋ฒ์๋ ์ ๋ฐ๋๊ฐ ํ์ํ ๊ฒ์ half ๋๋จธ์ง๋ float์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
์ค์ ๋ก Nvidia ์ชฝ GPU์ ๊ฒฝ์ฐ์๋ half๋ก ํ ๋ ์ฐ์ฐ์๊ฐ 2๋ฐฐ๋ก ๋นจ๋ผ์ง๋๋ค. ๊ทธ๋ ์ง๋ง ๊ทธ๋ ๋ค๊ณ float ์ ๋๋ก ์ ๋ฐํ ํ์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ half๋ก ๋ฐ๊พผ๋ค๋ฉด ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์๊ฒ ์ฃ ? โ Albedo๋ ๋น์ ๋ฐ๋๋ค๋ ์๋ฏธ๊ฐ ์๋๋๋ค. Diffuse์ ๋์ผํ๊ฒ ์๊ฐํ๋ฉด ๊ณค๋ํฉ๋๋ค. โ 3ds Max์์ ์ ํ ์ผ๋ฃจ๋ฏธ๋ค์ด์ (Self-illumination) ์ด๋ผ๊ณ ๋ถ๋ฅด๋ โ์๊ธฐ ๋ฐ๊ดโ ๊ธฐ๋ฅ์ด ๋ฐ๋ก Emission์ ๋๋ค โ o.Albedo์ o.Emission์ ๊ฐ์ ์ต์ข ์ ์ผ๋ก ์๋ก ๋ํด์ง๋๋ค. ์ฆ, ๋์ ๋ชจ๋ ์ฐ๋ฉด ํ์ฐ์ ์ผ๋ก ๋ฐ์์ง๋๋ค. Albedo > ์กฐ๋ช ์ฐ์ฐ์ ์ถ๊ฐ๋ก ๋ฐ๊ฒ ๋๊ณ , Emission ์กฐ๋ช ์ฐ์ฐ์ ๋ฐ์ง ์์์ โ์กฐ๋ช ๊ณผ ์๊ด์๋ ์์ํ ์์โ ๋ง์ด ์ถ๋ ฅ > ์์ํ ๊ฒฐ๊ณผ๋ฌผ์ ๋ณด๊ณ ์ถ์ ๋๋ Emission์ ์ฆ๊ฒจ์ ์ฌ์ฉ 1๋ณด๋ค ๋ฐ์ ์์ด ์๊ณ , 0๋ณด๋ค ์ด๋์ด ์์ด ์์ด์ ๊ทธ๊ฒ์ด ์กด์ฌํ๊ณ ๊ณ์ฐ๋๋ ์ํ๋ฅผ HDR (High Dynamic Range) float4.rgb => rgb๋ง ์ฐ๊ฒ ๋ค, ์๋ ํ๋ณํ ๋๋์ธ๋ฏ? float.rgb float.grb float.bgr float.rrr 1 = 1,1,1 / 0.5 = 0.5, 0.5, 0.5 o.Albedo = test.b ๋ผ๊ณ ์ฐ๋ฉด 0์ ์ ๋ ฅํ ๊ฒ๊ณผ ๊ฐ๊ธฐ ๋๋ฌธ์ ๊ฒ์ ์์ด ์ถ๋ ฅ ใด ์ด๋ ๊ฒ ๋ณ์์ ๋ถ๋ถ๊ฐ์ ์์ ์์ฌ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ค์์ฆ๋ง (Swizzling) ์ด๋ผ๊ณ ํฉ๋๋ค ์์ ์๋ ์ค๋ฅ๊ฐ ์๊ธฐ๋ฉด ๋ฌด์กฐ๊ฑด ๋ง์ ํ ์์ ์ถ๋ ฅํ์ง๋ง, ์ ๋ํฐ 5.5๋ถํฐ ๊ณ์ฐํ ์ ์์ ๋ ๊น์ง ๊ณ์ฐํ๊ณ ์ค๋ฅ ๋ฉ์ธ์ง ์ถ๋ ฅ ์ฌ๊ฐํ ์ค๋ฅ๋ผ๋ฉด ์ฌ์ ํ ๋ง์ ํ ์ปฌ๋ฌ๋ฅผ ๋ณด์ฌ์ค float x x.r ๊ฐ๋ฅ
float2 xx float3(0, xx.rg) float3(0, xx.gg) ์ธํฐํ์ด์ค ๋ณ์๋ฅผ CG์ฝ๋ ๋ด์์ ์ฌ์ฉํ๋ ค๋ฉด ๋๊ฐ์ ์ด๋ฆ์ ๋ณ์๋ฅผ ์์์ ์ ์ธํด์ฃผ๋ฉด ๋จ ๋ฐ๊ธฐ๋ฅผ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ -1 ~ 1 Range๋ก ๋ฐ์์ค๊ณ o.Albedo = rgb~ + ๋ณ์ ๊ฐ struct ์์ ์๋ฌด๊ฒ๋ ๋ค์ด์์ง ์์ผ๋ฉด ์๋จ float4 color : COLOR ์ด ๋ด์ฉ์ ๋ฒํ ์ค ์ปฌ๋ฌ๋ฅผ ๋ฐ์์ค๋ ๋ง๋ฒ์ ์ฃผ๋ฌธ, ํ์ฌ๋ก์๋ ์ด๋์๋ ์ฐ์ง ์์ต๋๋ค. ๋จ์ง ์๋ฌ๋ฅผ ํผํ๊ณ ์ ์ด ๊ฒ์ด์ง์. o.Alpha = 1 ๋ก ๋ถํฌ๋ช ํจ์ ํ์, ํ์ง๋ง โ์์ง์โ 0.5 ๋ 0 ์ ๋ฃ๋๋ค๊ณ ๋ฐํฌ๋ช ํด์ง๊ฑฐ๋ ํฌ๋ช ํด์ง์ง ์์ต๋๋ค. LOD > ์ด ์์ด๋์ ํ๊ฒฝ ์ค์ ์ ๋ฐ๋ฅธ ์ต์ ๊ฐ์ ๊ด๋ จ๋ ๋ด์ฉ
https://celestialbody.tistory.com/5
ํ ์ค์ณ๋ UV ์ขํ์ ํจ๊ป ๊ณ์ฐ๋์ด์ผ float4๋ก ์ถ๋ ฅ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์์ง UV์ ๊ณ์ฐ๋์ง ์์ ํ ์ค์ณ๋ ์์ (float4)์ผ๋ก ๋ํ๋ผ ์ ์๋ค. ๊ทธ๋์ ์ด๋๊น์ง๋ sampler๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๐ซ _4
๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ์์ด๋์์ Metalic์ด 0์ด๋ฉด ์คํํ๋ฌ ์ปฌ๋ฌ๊ฐ ํ๋ฐฑ(ํฐ ๋น์ ๋น์ถ์์ ๋)์ด ๋๋ฉฐ, Metalic์ด 1์ด๋ฉด ์คํํ๋ฌ ์ปฌ๋ฌ๊ฐ Albedo์ ๋ฃ์ ์์ด ๋ฉ๋๋ค. ๊ธ์์ ๊ณ ์ ์ ์คํํ๋ฌ ์ปฌ๋ฌ๋ฅผ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฐ๊ธ์ Metalic์์ 0๊ณผ1 ์ธ์ ๊ฐ์ ์ฐ์ง ์๋ ๊ฒ์ด ์ ํํ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ์์ด๋๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
Smoothness๋ ์ฌ์ง์ด ๋งค๋๋ฌ์ด์ง ๊ฑฐ์น์ง๋ฅผ ๊ฒฐ์ ํ๋ ๋ถ๋ถ.
0์ด๋ฉด ์๋ฒฝํ ๊ฑฐ์น ์ด์ ๋๋ฐ์ฌ๋ง ์ผ์ด๋๊ณ , 1์ด๋ฉด ์๋ฒฝํ ๋งค๋๋ฌ์์ ์ ๋ฐ์ฌ๋ง ์ผ์ด๋๊ฒ ๋ฉ๋๋ค.
๋๋ฐ์ฌ๊ฐ ์ผ์ด๋๋ ์ด์ ๋ โ๊ฑฐ์น ํ๋ฉดโ ๋๋ฌธ์ด๋ฉฐ, ํนํ ๊ฒ์ผ๋ก๋ ๋ถ๋๋ฌ์ ๋ณด์ด๋๋ผ๋ ๋ฏธ์ธํ ํ๋ฉด ๋จ๊ณ์์์ ๊ฑฐ์น ๊ธฐ ๋๋ฌธ์ (๊ฑฐ์ ๋ถ์ ๋จ์๋ก) ํผ๋ถ๋ ์ฒ์ ๊ฒฝ์ฐ์๋ ์คํํ๋ฌ๊ฐ ์ ๊ฒ ๋ํ๋๋ ๊ฒ์ ๋๋ค.
์ฆ, ์ฌ์ง์ด ๋งค๋ํ๋ฉด ๋๋ฐ์ฌ(Diffuse) ์ฐ์ฐ๋ณด๋ค ์ ๋ฐ์ฌ(Specular) ์ฐ์ฐ์ด ๋์ด๋๋ฉฐ, ์ด๊ฒ์ ์กฐ์ ํ ์ ์๋๊ฒ Smoothness ์ธ์ ์ ๋๋ค.
๋ฒคํ ๋ธ๋ ๊ฐ์ ํน์ํ ๋ฌผ์ง์ ์ ์ธํ๊ณ ๋ ๋๋ถ๋ถ ์ด๋ ์ ๋์ ์คํํ๋ฌ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ฐ๋ฆฌ๊ฐ ์ง๊ฐ์ ๋๋ผ๊ฒ ๋๋ ์์๋ ๊ฑฐ์ ์คํํ๋ฌ, ๊ทธ๋์ ์คํํ๋ฌ๊ฐ ์์ผ๋ฉด ๊ฑฐ์ ์ง๊ฐ์ ๋๋ผ๊ธฐ๊ฐ ํ๋ ๊ฒ.
์ ๋ํฐ์์ Standard Shader๋ผ๋ โ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ๋ ๋๋งโ ์ ๊ธฐ๋ณธ ๊ฐ๋ ์ โ์๋์ง ๋ณด์กด ๋ฒ์นโ์ผ๋ก โ๋๊ฐ๋ ๋น์ ์์ ๋ค์ด์จ ๋น์ ์์ ๋์ ์ ์๋คโ๋ผ๊ณ ๊ฐ๋จํ๊ฒ ์ค๋ช ํ ์ ์์ต๋๋ค.
์ผ๋ฐ ํ
์ค์ณ๋ฅผ ๋
ธ๋ง๋งต์ผ๋ก ๋ง๋ค ์ ์์.
Create from Grayscale ์ต์
์ ์ฒดํฌํ๊ณ , Bumpniss๋ Filtering์ ์ ์ ํ ์กฐ์
NormalMap์ ์ผ๋ฐ์ ์ธ ํ
์ค์ณ๊ฐ ์๋๋ค.
NormalMap์ ์ผ๋ฐ์ ์ธ ๊ฒ์์ฉ ํ
์ค์ณ ํฌ๋งท์ธ DXT1 ํน์ DXT5๊ฐ ์๋๋ผ DXTnm์ด๋ผ๋ ํ์ผ ํฌ๋งท์ด๋ค.
(ํ๋ซํผ์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์๋๋ก์ด๋์์๋ ETC ํ์ผ ํฌ๋งท์ ์ฐ๊ธฐ๋ ํ๋ค. ์ฌ๊ธฐ์๋ PC ๊ธฐ์ค์ผ๋ก ์ค๋ช
ํ๊ฒ ๋ค.)
์ด ํ์ผ ํฌ๋งท์ ์ผ๋ฐ์ ์ธ ํ
์ค์ณ์ ์์ถ์ ์ํ NormalMap ํ์ง์ ์ ํ๋ฅผ ๋ง๊ธฐ ์ํด ๋ง๋ AG ํ์ผ ํฌ๋งท์ด๋ค.
์ด ํฌ๋งท์ NormalMap์ R๊ณผ G์ ํ๋ฆฌํฐ๋ฅผ ์ต๋ํ ๋ณด์ ํ์ฌ A์ G์ ๋ฃ์ด ์ ์ฅํ๋ค. (B๋ ๊ฐ์ง๊ณ ์์ง ์๋ค)
์ด๋ ๊ฒ ๋ณด์ ๋ R๊ณผ G๋ NormalMap์ X์ Y๋ก ๊ณ์ฐ๋๋ฉฐ, Z๋ ์ผ๊ฐํจ์๋ฅผ ์ด์ฉํ์ฌ ์ํ์ ์ผ๋ก ์ถ์ถ์ด ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ด ํ
์ค์ณ๋ฅผ ์ด์ฉํด์ NormalMap์ผ๋ก ์จ์ ํ๊ฒ ์์ฑํด๋ด๋ ค๋ฉด ์์ ์ค๋ฉํ๋ ๊ณต์์ด ์ ์ฉ๋์ด ์๋ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๊ฐํธํ๋ค.
float3 y = UnpackNormal ( float4 x );
o.Normal = UnpackNormal ( tex2D (_BumpMap, IN.uv_bumpMap) );
or
fixed3 n = UnpackNormal(tex2D(_BumpMap, IN.uv_bumpMap));
o.Normal = float3(n.x * 2, n.y * 2, n.z);
๊ฐ๋ ์กฐ์ (Z์ถ์ ๊ฑฐ์ ์ํฅ์ ๋ผ์น์ง ์๊ธฐ ๋๋ฌธ์ ์ฐ์ฐํด์ค ํ์๊ฐ ์๋ค, ๋ฌผ๋ก 1์ด์์ ๊ณฑํ ํ ๋ด๋ถ์ ์ผ๋ก normalize๋ฅผ ํ๋ค๋ฉด ์ฝํ๊ฒ ๋ง๋ค์ด ์ค ์ ์๊ฒ ์ต๋๋ค๋ง ์ด ๋จ๊ณ์์๋ ์ ์ ์น ์์ผ๋ฏ๋ก ์ค๋ช
์ ์๋ตํ๊ฒ ์ต๋๋ค.)
Occlusion (Ambient Occlusion)์ ๊ตฌ์์ง ๋ถ๋ถ์ ์ถ๊ฐ์ ์ธ ์์์ ํํํ๋ ๊ธฐ๋ฅ
์ผ๋ฐ์ ์ผ๋ก ํ๊ฒฝ๊ด (Ambient Color)๋ก ๊ฐ๋ ์ฐจ ์๋ ์ธ์์์ ๊ทธ๋ฆผ์๊ฐ ๋๋ฆฌ์์ง ๋ถ๋ถ๋ ์ฌ๋ฐฉ์์ ์ค๋ ํ๊ฒฝ๊ด ์ ๋๋ฅผ ๋ฐ๊ณ ์๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค.
ํ์ง๋ง ๋งค์ฐ ๊ตฌ์์ ธ ์๊ฑฐ๋ ๋ณต์กํ ๋ฌผ์ฒด๋ค๋ก ๊ฐ๋ ค์ ธ์ ํ๊ฒฝ๊ด๋ ๋ฟ์ง ๋ชปํ๋ ๋ถ๋ถ์ ๋์ฑ ๋ ์ด๋์์ง๋๋ฐ ์ด ๋ถ๋ถ์ Ambient Occlustion (ํ๊ฒฝ ์ฐจํ)๋ผ๊ณ ๋ถ๋ฆ
๋๋ค.
ํน์ดํ๊ฒ๋ Occlusion ๋งต์ ๋
๋ฆฝ๋ UV๋ฅผ ๋ฐ์ผ๋ฉด ์๋ฌ๊ฐ ๋ฉ๋๋ค. ๋ฐ๋์ _MainTex๊ฐ์ UV๋ฅผ ์ฌ์ฉํด์ผ ์ ์์ ์ผ๋ก ์๋.
o.Occlusion์ด float์ ๋ฐ๊ธฐ ๋๋ฌธ์, RGB๋ฅผ ๋ชจ๋ ์ฌ์ฉํ๋ ํ
์ค์ณ ํ ์ฅ์ ๋จ์ง Occlusion ๊ธฐ๋ฅ์ ์ํด ์ถ๊ฐํ๋ ๊ฒ์ ๋ญ๋น.
_MainTex์ ์ํ ์ฑ๋์ Occlusion์ผ๋ก ์ฌ์ฉํ๋ค๋์ง
์ง๊ธ๊น์ง ์ ๋ํฐ์ ๋ด์ฅ๋ PBS ์์ด๋์ธ Standard Shader์ Metail Pass์ ๊ธฐ๋ณธ ์กฐ์์ ์ ๋ํด ์์ค๋ณด์๋ค.
https://unity.com/kr/releases/editor/archive
๋ค์ด๋ก๋ ์์นด์ด๋ธ์์ ๋ด์ฅ ์์ด๋๋ฅผ ๋ค์ด ๋ฐ์ ์ ์๋ค.