Normal, NormalMap
๐ซ ๋ง๋จธ๋ฆฌ
Normal๊ณผ NormalMap์ ๋ํด.
๐ซ Normal, NormalMap
๐ซง Normal
๋ฒ์ ๋ฒกํฐ.
ํ๋ฉด/Face์ ๋ฐฉํฅ/๊ฐ๋/๊ธฐ์ธ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ฒกํฐ.
๐ซง NormalMap
Normal์ ํ ์ค์ณ๋ก ๋ง๋ ๊ฒ.
๐ซง Use
๊ตด๊ณก์ ๋ง๋ค์ด์ฃผ๋, ํน์ ๋ถ์ค์ ๊ทธ๋ฆผ์์ง๊ฒ ๋ง๋ค์ด์ฃผ๋, ๊ทธ๋์ ํ๋ฆฌํฐ๊ฐ ๋์๋ณด์ด๊ฒ ๋ง๋ค์ด์ฃผ๋ ํ
์ค์ณ.
์ค์ ๋ฉ์ฌ ํด๋ฆฌ๊ณค ๋ํ
์ผ์ด ์๋ ๋ถ๋ถ์ ๋ํ
์ผ์ด ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒํ๋ ๋งต
์ผ๋ฐ์ ์ผ๋ก๋, ๋ก์ฐํด๋ฆฌ๋ฉ์์์ ํ์ดํด๋ฆฌ๋ฉ์์ ๋ํ ์ผ์ ์ด๋ ค์ฃผ๋ ์ญํ
๐ซง Why
https://docs.unity3d.com/kr/2020.3/Manual/StandardShaderMaterialParameterNormalMap.html
์ค๋ธ์ ํธ์ ๋ํ
์ผ. ๋์ฌ, ์กฐ๊ธ์ฉ ํ์ธ ๊ณณ ๊ฐ์.
์ด๋ฐ ๊ฒ๋ค์ ๋ฉ์ฌ๋ก ํํ๋๋ค.
๋ํ
์ผ์ ๋ฉ์ฌ๋ก ํํํ๋ค๋ ๊ฒ์, ํฐ ๋ฉ์ฌ์์ ๋ฏธ์ธํ ํด๋ฆฌ๊ณค์ ์จ์ผ ํ๋ค๋ ๊ฒ.
๋ฏธ์ธํ ํด๋ฆฌ๊ณค์ ์๊ฐ ๋ง์์ง๋ค๋ฉด, ์ต์ ํ ์ธก๋ฉด์์, ๊ด๋ฆฌ ์ธก๋ฉด์์ ๋ณต์กํด์ง๋ค.
๋ฏธ์ธํ ํด๋ฆฌ๊ณค ๋์ , ๋ํ ์ผ์ ํํํ๋ ๋์ฒด ๋ฐฉ๋ฒ์ผ๋ก NormalMap์ ์ฌ์ฉํ๋ค.
(ํ์ดํด๋ฆฌ์) ๋ ธ๋ง ์ ๋ณด๋ฅผ ํ ์ค์ณ ์ด๋ฏธ์ง ํํ๋ก ์ ์ฅํ์ฌ ๋ก์ฐํด๋ฆฌ์ ์ ์ฉ์ํค๋ ๊ฒ์ด๋ค.
ํ์ดํด๋ฆฌ โ ํด๋ฆฌ๊ณค์ด ๋ง์ โ ๋
ธ๋ง์ด ๋ง์
๋ก์ฐํด๋ฆฌ โ ํด๋ฆฌ๊ณค์ด ์ ์ โ ๋
ธ๋ง์ด ์ ์
๐ซ NormalMap์ ๋ฌด์จ ์์ผ๊น (WIP)
๐ซง ๊ถ๊ธ์ฆ
์ผ๋ฐ์ ์ผ๋ก Unity Editor์ Project ์ฐฝ์์ NormalMap์ ํ๋๊ฒ ๋ณด์ธ๋ค.
๊ทธ๋ฐ๋ฐ, NormalMap์ Albedo์ ๋ฃ์ Material์ Mesh์ ์ ์ฉ์ํค๋ฉด, ์ด์ํ๊ฒ๋ ๋นจ๊ฐ๊ฒ ๋์จ๋ค
Project ์ฐฝ์์ ํ๋๊ฒ ๋ณด์ด๋ NormalMap์ด ์ ๋นจ๊ฐ์์ผ๋ก ๋์ค๋์ง ๊ถ๊ธํ๋ค.
์ ์ด๋ ๊ฒ ๋์ค๋์ง, ๊ทธ๋์ NormalMap์ ์ด๋ค ์์ธ ๊ฒ์ธ์ง์ ๋ํด ์์๋ณด์๋ค.
๐ซง 1. NormalMap์ ๋นจ๊ฐ์์ด ๋ง๋ค
๊ฒฐ๋ก ์ ์ผ๋ก, NormalMap์ ๋นจ๊ฐ์์ด ๋ง๋ค.
์ด ์ด์ ๋ฅผ ์๊ธฐ ์ํด์๋ NormalMap์ ์๋ฆฌ์ ์์ถ๋ฐฉ์๊ณผ ๋ํด ์์์ผ ํ๋ค.
R U
G V
B Normal
https://www.reddit.com/r/Unity3D/comments/vcty4f/pink_normals/
Unity Normal๋งต ์์ถ์ DXTnm์ ์ฌ์ฉํ๊ณ ๋
ธ๋ฉ์ RGBA = (1.0, y, y, x)๋ก ์ ์ฅ
https://steamdb.info/patchnotes/5003146/ https://docs.unity3d.com/kr/2020.3/Manual/SL-BuiltinIncludes.html
https://80.lv/articles/overwatch-technical-overview/
์ค๋ฒ์์น๋ ์ค์ ๋ก ๋
ธ๋ ๋
ธ๋ง๋งต์ ์ด๋ค
BC5 ๊ฐ์ ์์ถ ๋ฐฉ๋ฒ์ ์จ์, ์ถํ์ ์ธํฉ(์์ถํด์ )ํ ๋ ๋ธ๋ฃจ ์ฑ๋์ ๋ง๋ค์ด๋ธ๋ค
์ด๋ ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ , ์ ์ ์ํฐํฉํธ
์ผ๋ฐ ๋ ธ๋ฉ ๋งต์ ์ป์ผ๋ ค๋ฉด ์ํ ์ฑ๋์ ๋ น์ ์ฑ๋๋ก ์ด๋ํ๊ณ ํ๋์ ์ฑ๋์ ์์ํ ํฐ์
https://catlikecoding.com/unity/tutorials/rendering/part-6/
https://docs.unity3d.com/kr/2020.3/Manual/SL-BuiltinIncludes.html ์ ๋ํฐ๊ฒฝ๋ก/Data/CGIncludes/UnityCG.cginc
UnpackScaleNormal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
inline fixed3 UnpackNormalDXT5nm (fixed4 packednormal)
{
fixed3 normal;
normal.xy = packednormal.wy * 2 - 1;
normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
return normal;
}
// Unpack normal as DXT5nm (1, y, 1, x) or BC5 (x, y, 0, 1)
// Note neutral texture like "bump" is (0, 0, 1, 1) to work with both plain RGB normal and DXT5nm/BC5
fixed3 UnpackNormalmapRGorAG(fixed4 packednormal)
{
// This do the trick
packednormal.x *= packednormal.w;
fixed3 normal;
normal.xy = packednormal.xy * 2 - 1;
normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
return normal;
}
inline fixed3 UnpackNormal(fixed4 packednormal)
{
#if defined(UNITY_NO_DXT5nm)
return packednormal.xyz * 2 - 1; //DXY๊ฐ ์๋๋ฉด ๊ทธ๋ฅ๋ฒ์๋ง ์กฐ์ ํด์
#else
return UnpackNormalmapRGorAG(packednormal);
#endif
}
https://community.gamedev.tv/t/baking-normal-map-on-orc-horn-turning-out-yellow/182487
ํ๋ ๋
ธ๋ง๋งต์ ์ค๊ฐ์ค๊ฐ ๋
ธ๋ ๋
ธ๋ง๋งต
๋ฉด์ด ๋ค์งํ์ ธ ์๋ค๋์ง?
- Normalmap์ ์ฐ๊ธฐ ์ํด ํ๋กํผํฐ์ _BumpMap(โNormalmapโ ,2D) = โbumpโ{} ๋ฅผ ์ ์ธ
- Normalmap์ ๊ฒ์์ฉ ํ ์ค์ณ ํฌ๋งท์ธ DXT1, DXT5๊ฐ ์๋๋ผ DXTnm์ ํฌ๋งท
- DXTnm์ ์ผ๋ฐ์ ์ธ ํ ์ค์ฒ ์์ถ์ผ๋ก ์ธํ Normalmap ํ์ง์ ํ๋ฅผ ๋ง๊ธฐ์ํ AGํ์ผ ํฌ๋งท
- ์ด ํ ์ค์ณ๋ฅผ ์ด์ฉํ์ฌ Normalmap์ ์์ฑํด๋ด๋ ค๋ฉด ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํจ
์ด ํ์ผ ํฌ๋งท์ ์ผ๋ฐ์ ์ธ ํ ์ค์ณ์ ์์ถ์ ์ํ NormalMap ํ์ง์ ์ ํ๋ฅผ ๋ง๊ธฐ ์ํด ๋ง๋ AG ํ์ผ ํฌ๋งท. ์ด ํฌ๋งท์ NormalMap์ R๊ณผ G์ ํ๋ฆฌํฐ๋ฅผ ์ต๋ํ ๋ณด์ ํ์ฌ A์ G์ ๋ฃ์ด ์ ์ฅํจ. (B๋ ๊ฐ์ง๊ณ ์์ง ์์) ์ด๋ ๊ฒ ๋ณด์ ๋ R๊ณผ G๋ NormalMap์ X์ Y๋ก ๊ณ์ฐ๋๋ฉฐ, Z๋ ์ผ๊ฐํจ์๋ฅผ ์ด์ฉํ์ฌ ์ํ์ ์ผ๋ก ์ถ์ถ๋จ
๊ทธ๋ฌ๋ฏ๋ก ์ด ํ ์ค์ณ๋ฅผ ์ด์ฉํด์ NormalMap์ผ๋ก ์จ์ ํ๊ฒ ์์ฑํด๋ด๋ ค๋ฉด ์์ ์ค๋ช ํ ๊ณต์์ด ์ ์ฉ๋์ด ์๋ ํจ์๋ฅผ ์ด์ฉํ๋ฉด ๊ฐํธํจ.
DXT5nm์์์ ๋ ธ๋ฉ ์ฒ๋ฆฌ.
์๋ DXTnm๋ BC5์ ๋ ธ๋ฉ ํ ์ค์ณ์ RGB ์์์ 1๊ฐ์ ์ฑ๋์ ๋ํด RGBA๋ก ๋ฐ๊พธ๊ณ ์์ค R์ G๋ก, ์์คG๋ A๋ก ๋ณ๊ฒฝํด R๊ณผ B๋ ๊ณต๋ฐฑ์ผ๋ก ๋๋ค.(์ด๋ ๊ฒ ๋จ์ผ๋ก ์ํฐํฉํธ๋ฅผ ์ค์ผ์ ์์) ๋ฐ๋ผ์ packednormal.xy๋ packednormal.ag์ ๋์ผํ๋ค.
์ด๋ DXT5 R:5 G:6 B:5 A:8๋ก ๋ณํ(RGB16bit๋ฅผ 24bit RGBA๋ก ๋ณํ)ํ ๋ G์A์ฑ๋ ๊ฐ์ด ๊ฐ์ฅ ํฌ๊ธฐ ๋๋ฌธ
https://docs.unrealengine.com/5.1/ko/vector-operation-material-expressions-in-unreal-engine/
https://forum.unity.com/threads/modifying-standard-shader-to-work-with-dxt-normal-textures.774353/
https://forum.unity.com/threads/runtime-generated-bump-maps-are-not-marked-as-normal-maps.413778/
5.5๋ณด๋ค ์๋ก์ด Unity ๋ฒ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋นจ๊ฐ์๊ณผ ํ๋์ ์ฑ๋์ด ๊ฒ์ ์์ด ์๋ ํฐ์์ด์ด์ผํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ ์ด์ ์๋ํ๊ธฐ ์ํด ๋
ธ๋ฉ ๋งต์ ์ค์์ฆ๋งํ ํ์๋ ์์ต๋๋ค.
์ ์ฒด โ๋ ธ๋ฉ ๋งตโ ์ง์ ์ ๊ฒ์๊ณผ ๋ ๋๋ง ์์คํ ์ ๊ฐ๋ ์ด ์๋ ์์ ํ ์๋ํฐ ํ ์ค์ฒ ์ํฌํฐ์ด๋ฉฐ, ํน๋ณํ ๋ฐฉ์์ผ๋ก ํฌ๋งท๋ ํ ์ค์ฒ2D ์ ์ ์ผ ๋ฟ์ ๋๋ค.
๊ฒฝ๊ณ ๊ฐ ๊ท์ฐฎ๊ณ ์ปค์คํ
์
ฐ์ด๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ _BumpMap
๋๋ _NormalMap
๋ผ๋ ํ
์ค์ฒ ์์ฑ ๋๋ [Normal] ์ฌ์ง ์์ฑ ์๋์ ์ฌ์ฉํ์ง ๋ง์ญ์์ค.
2017.2 ~ 2018.4 ์ฌ์ด์
์ด์ ์๋ float4(1, y, 1, x)๋ก ํ์๋์์ง๋ง ์ด์ ๋ float4(x,y,?,1)์
๋๋ค.
2017.1์ BC5 ๋
ธ๋ฉ๋งต์ ๋ํ ์ง์ ์ถ๊ฐ
์ ํ์ ์ผ๋ก RGBA 1y1x (์ค์ ๋ก๋ ์ค์์ฆ DXT5์ธ โDXTnmโ ๋๋ ์ค์์ฆ RGBA32์ธ โ์ ํ Nm 32๋นํธโ๋ก ํ์๋จ) ๋ฐ RG xy01 ํฉ ๋
ธ๋ฉ(BC5๋ ํญ์ 0.0B ๋ฐ 1.0A๋ฅผ ๋ฐํํ๋ 5์ฑ๋ RG ์ ์ฉ ํ์์)์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. 6.2018 ๋ฐ ์ด์ ๋ฒ์ ์ ๊ฒฝ์ฐ ์ค์ ๋ก yyyx๋ก ์์ถ๋์์ง๋ง GA ์ฑ๋ ๋ง ์ฌ์ฉ๋์์ต๋๋ค.
4.5์์๋ ๋ ๋ค ๊ณ์ ์ง์๋ฉ๋๋ค. HDRP์ ๊ธฐ๋ณธ๊ฐ์ BC5 ๋ ธ๋ฉ ๋งต์ ๋๋ค. LWRP ๋ค๋ฅธ ๊ฐ์ ํ์ ๊ธฐ๋ณธ ํ์์ BC1 ๋ฐ ์ด์ โDXTnmโ์ ๋ชจ๋ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณด์์ง๋ง ํ์ฌ ๊ธฐ๋ณธ๊ฐ์ ์ดํด ์์์ต๋๋ค. ๋ด์ฅ ๋ ๋๋ง ๊ฒฝ๋ก ์ธ AFAIK๋ ์ฌ์ ํ DXTnm์ ์ฌ์ฉํ์ง๋ง 1y01x ๋ฐ xy<>์ด ๋ชจ๋ ์ง์๋ฉ๋๋ค.
RGBA(107, 153, 250, 255)๋ Unity 2017, 1๋ถํฐ RGBA(153, 107, 255.153)๊ฐ ๋์ด์ผ ํฉ๋๋ค. ์ค์ ๋ก B ๊ฐ์ ๋ค์ ์์์ ์ด๋ฉฐ 0, 255, G ๋๋ ํ ์ค์ฒ์ ์์ถํ๋ ค๋ ๋ค๋ฅธ ์์์ ๋ฐ์ดํฐ๊ฐ ๋ ์ ์์ง๋ง ์ผ๋ถ ์ถ๊ฐ ์์ถ ์ํฐํฉํธ๊ฐ ํ์ํฉ๋๋ค. ๊ทธ ์ด์ ๋ ์ง๋ ๊ฒ์๋ฌผ์์ ๋ณผ ์ ์๋ฏ์ด Unity๊ฐ R ์ฑ๋๊ณผ A ์ฑ๋์ ํจ๊ป ๊ณฑํ์ฌ ์ธ์ฝ๋ฉ ๋ X๋ฅผ ์ป์ ๊ธฐ ๋๋ฌธ์ Unity 2017.1 ์ด์์ RG ๋ฐ AG ์ผ๋ฐ ์ธ์ฝ๋ฉ์ ๋ชจ๋ ์ง์ํฉ๋๋ค.
์ด ๊ฐ์ ๋ํด ์กฐ๊ธ ๋ ๋ค๋ฃจ๊ณ ์ถ์์ต๋๋ค. BC (์ผ๋ช DXTC) ์์ถ ํ์์ด ์๋ํ๋ ๋ฐฉ์, ๋นจ๊ฐ์ ๋ฐ ํ๋์ ์ฑ๋์ ๊ฐ๊ฐ 5 ๋นํธ๋ฅผ ์ฌ์ฉํ๊ณ ๋ น์ ์ฑ๋์ ๋ธ๋ก ์์ ํ๋ ํธ ๋น ์ธ์ฝ๋ฉ์ 6 ๋นํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ๋ น์ ๊ฐ์ด ๋นจ๊ฐ์ ๋๋ ํ๋์๋ณด๋ค ์ ๋ฐ๋๊ฐ ์ฝ๊ฐ ๋ ๋๊ธฐ ๋๋ฌธ์ Y๊ฐ ๋ น์ ์ฑ๋์ ๋จ์ ์์ต๋๋ค. Unity๋ ์ค์ ๋ก โDXTnโ์ (1.0, y, y, x)๋ก ์ ์ฅํ์ง๋ง G์ B์ ์ ๋ฐ๋ ์ฐจ์ด๋ ์ ฐ์ด๋๋ก ์ํ๋งํ ๋ ์๋ฒฝํ๊ฒ ๋์ผํ์ง ์์ ์ ์์์ ์๋ฏธํฉ๋๋ค. ์์งํ ์ ํ๋์ ์ฑ๋์์ Y๋ฅผ ๋ณต์ ํ๊ธฐ๋ก ์ ํํ๋์ง ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ทธ๋ ์ด ์ค์ผ์ผ ๊ฐ์ผ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ 3 ๊ฐ ์ฑ๋ ๋ชจ๋ Y๋ฅผ ์ ์งํ๊ณ ๋นจ๊ฐ์์ 1.0์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ๊ธฐ์กด ์ฝ๋์ ๋ํ ๊ฐ์ฅ ์์ ๋ณ๊ฒฝ ์ฌํญ์ด์์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ RGB ์ฑ๋์ ๋ณต์ ๋ ๋ ์ผ๋ถ ์ธ์ฝ๋๊ฐ ์ฝ๊ฐ ๋ ์ ์ํ ๋ ์ ์์ง๋ง ํ์์ด ๊ทธ๋ ๊ฒ ๋ ์ ์์ถ ๋ ๊ธฐ์ ์ ์ธ ์ด์ ๋ ์์ต๋๋ค.
https://someiyoshino.info/entry/20171205/1512486725
DXTC, DXT5, BCn BC3
Direct X Texture Compression
Block Compression
DXT5 = BC3
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=hram01&logNo=221489477514