ํ์ค์์ฝ : ์์ด๋๊ทธ๋ํ ๋ณ์ ์
--------------------------------------------------------------
์ ๋ํฐ 2018 ๋ค์ด์ค๋ฉด์ ๋ค๋ค ์คํฌ๋ฆฝํฐ๋ธ ๋ ๋ ํ์ดํ๋ผ์ธ ๊ธฐ๋ํ์๊ฑฐ๋ผ ์๊ฐํจ
์! ์ปฌ๋ง! ๋๋ก์! ๋๋์ด ๋ธ๋๋ฐ์ค๊ฐ๋ ๋นํธ์ธ ๋ ๋ ํ์ดํ๋ผ์ธ์ ๋ฒ์ด๋๋๊ตฌ๋! ์ด์ ๋์ ๊ทธ๋ํฝ์ค ์ค๋ ฅ์ ๋ฝ๋ผ๋๊ฐ ๋๊ฑฐ์ผ!
๋ ๊ฟ์ด๊ณ ์์ค ๊น๋ณด๋๊น ๋ญ์๋ฆฐ์ง ํ๋๋ ๋ชจ๋ฅด๊ฒ ๋๋ผ
๊ทธ๋์ ๊ฑ ใ ใ ... LWRP(์ ๋ํฐ๊ฐ ์ ๊ณตํ๋๊ฑฐ. ๊ฒฝ๋ ๋ ๋ ํ์ดํ๋ผ์ธ)์ ์จ๋ณด๊ธฐ๋ก ํ๋ค
LWRP๊ฐ ๊ฐ์กฐํ๋๊ฑด ํฌ๊ฒ ๋๊ฐ์ง์
1. ๋ชจ๋ฐ์ผ/VR ๊ธฐ๊ธฐ์์ ์งฑ ๋น ๋ฅธ ์ฑ๋ฅ
2. ๊ด์ ์ฌ๋ฌ๊ฐ๋ฅผ ์ฑ๊ธํจ์ค๋ก ์ฒ๋ฆฌํด์ ๋๋ก์ฐ์ฝ ์ต์ํ
3. ์์ด๋๊ทธ๋ํ๋ก ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ์์ด๋ ๋ง๋ค๊ธฐ
์จ๋๊ณ ๋ณด๋ ์ ์ด์ง๋ง ์๋ฌดํผ ๋๋ 3๋ฒ์ ์จ๋ณด๊ณ ์ถ์๋ค
์ง๊ธ ํ๊ณ ์๋ ํ๋ก์ ํธ๋ ๋ฉ์ธ๊ด์ ์์ฃผ๋ผ์ 2๋ฒ์ด ๋ณ ํ์๊ฐ ์์๊ณ , 1๋ฒ์ ๋ฒค์น๋งํฌ ํ๊ธฐ ์ ๊น์ง ๋ชจ๋ฅด๋๊ฑฐ์์

(์์ด๋๊ทธ๋ํ๋ ๋์ถฉ ์ด๋ฐ ๊ธฐ๋ฅ์. ๋ ธ๋ ์ฐ๊ฒฐํด์ ์์ด๋ ์ง๋๊ฑฐ)
๊ทผ๋ฐ LWRP ์ ์ฉํ ์ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ณ , ์์ด๋๊ทธ๋ํ๋ฅผ ์ด์ด๋ณด๋๊น
๋ ์ฉ
Unlit์ ๊ด์ ๋ฐ์์ค๋ ๋ ธ๋๊ฐ ์๋ค
์ด๋ง์ธ์ฆ ๋จ๋ฒํธ๋ ํํ๋จ๋ฒํธ, ํฐ ์์ด๋ฉ, ๋ธ๋ฆฐํ ๋ฑ๋ฑ์ ๋ด๋ง๋๋ก ์ค์ ํ ๋ฐฉ๋ฒ์ด ์๋ค๋๊ฑฐ์
๋ฌด์กฐ๊ฑด ๋ช ์์ฒ๋ฆฌ๋ฅผ ํ๋ ค๋ฉด ๋ฌผ๋ฆฌ๊ธฐ๋ฐ ๋ ๋๋ง์ ํ๊ฑฐ๋, ์์ด๋๊ทธ๋ํ ๋๋ ค์น๊ณ ์ง์ ์ฝ๋ ์ง๋ ์๋ฆฌ์
๋ ์์ฉ?
๊ทผ๋ฐ ์ข ์ฐพ์๋ณด๋ ์ ๋ํฐ ์๋ค๊ฐ ์ข ๋ชจ์๋ผ์ ์ด๊ฑธ ์๋ง๋ค์ด๋๊ธด ํ๋๋ฐ, ๋ง๋ค ๋ฐฉ๋ฒ์ ๋ง๋ จํด๋์๊ฑฐ ๊ฐ๋๋ผ
C# ์คํฌ๋ฆฝํธ๋ก ์ปค์คํ ๋ ธ๋๋ฅผ ์ถ๊ฐํ ์ ์๋๋ฐ, ์ฌ๊ธฐ๋ค string์ผ๋ก ์์ด๋ ์ฝ๋๋ฅผ ์จ๋์ ์ ์์

๊ทธ๋ผ ํด๊ฒฐ์ฑ ์ย ๊ฐ๋จํ๋ค
1. LWRP ์์ค์ฝ๋๋ฅผ ๋ค์ ธ์ ๋ฉ์ธ ๊ด์์ ๋ฐฉํฅ๊ณผ ์์์ ๋ฐ๋ ๋ฐฉ๋ฒ์ ์์๋
2. ๊ทธ๊ฑธ๋ก ์ปค์คํ ๋ ธ๋๋ฅผ ์ถ๊ฐํจ
1๋ฒ์ ์ฌ์ ๋ค
LWRP/Shaders/LightweightStandardSimpleLighting.shader ๋ฅผ ๋ณด๋ฉด ์๋
LWRP/ShaderLibrary/LightweightPassLitSimple.hlsl ๋ฅผ ํฌํจํ๋๋ฐ ๊ฑ๋
LWRP/ShaderLibrary/Lighting.hlsl ๋ฅผ ํฌํจํ๊ณ , ๊ฑฐ๊ธธ ์ ๋ค์ ธ๋ณด๋ฉดย _MainLightPosition์ย _MainLightColor๋ฅผ ์ฐ๋๊ฑธ ์์์์
๊ทธ๋ผ ๊ทธ๊ฑธ ์ฌ์ฉํด์ ์ปค์คํ ๋ ธ๋๋ฅผ ์ง๋ฉด
{
ย ย Dirc = _MainLightPosition.xyz;
ย ย Col = float4(_MainLightColor.rgb, 1);
}
์ด๋ ๊ฒ ๋๋๋ฐ, ์ด๋๋ก ๋๋ ค๋ณด๋
์๋๋ค
????
_MainLightPosition๊ฐ ์กด์ฌํ์ง ์๋๋ค๊ณ ๋์ค๋๋ฐ,
์์ด๋๊ทธ๋ํ์์ Copy Shader๋ฅผ ๋ ์ ํ
์คํธ ์๋ํฐ์์ ํ์ธํด๋ณด๋ฉดย #include "LWRP/ShaderLibrary/Lighting.hlsl" ๊ฐ ๋ค์ด์๊ธฐ ๋๋ฌธ์
์ ๊ฒ ์กด์ฌํ์ง ์์๋ฆฌ๊ฐ ์๋ค
์๋ง ์งฑ๊ตฌ๋ฅผ ๊ตด๋ ค๋ด๋ ์ ๊ฒ ์๋ ์ด์ ๊ฐ ์๋ค
๊ทธ๋์ ๋ธ ๊ฒฐ๋ก ์, ์์ด๋์ฝ๋ ์์ฑํ๊ธฐ ์ ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ํต๊ณผ ๋ชปํ๋๊ฒ ํ๋ฆผ์๋ค๋๊ฑฐ์๋ค
๊ฐ ์ปค์คํ ๋ ธ๋๋ณ๋ก ๊ฒ์ฆ์ ๊ฑฐ์น๊ณ ํต๊ณผํ ์ ๋ค๋ง ํตํฉํด์ ์์ด๋๋ฅผ ๋ง๋๋ ๊ฑธ๋ก ์ถ์ ๋๋ค
๊ทธ๋ฌ๋ฉด ๊ฒ์ฆ์ ํต๊ณผํ๊ธฐ ์ํด ์ฌ๊ธฐ๋ฅผ ์ณ์ผ ํ๋ค.ย ํญ์ค๋ฐ๊ฒ์ฒ๋ผ.
{
#ifdef LIGHTWEIGHT_LIGHTING_INCLUDED
ย ย Dirc = _MainLightPosition.xyz;
ย ย Col = float4(_MainLightColor.rgb, 1);
#else
ย ย Dirc = float3(0,0,0);
ย ย Col = float4(0,0,0,0);
#endif
}
LIGHTWEIGHT_LIGHTING_INCLUDED ํ๋๊ทธ๋ย Lighting.hlsl ๋งจ ์์ค์์ ์ ์๋๋ค
๋ฐ๋ผ์ ์ปค์คํ ๋ ธ๋๋ฅผ ์ด๋ฐ์์ผ๋ก ์ง๋ฉด, ์ปค์คํ ๋ ธ๋ ๊ฒ์ฆ ๊ณผ์ ์์ ์๋ซ์ค๋ก ๋ค์ด๊ฐ๊ณ , ์์ฑ๋ ์์ด๋์์ ์์ค๋ก ๋ค์ด๊ฐ
์ฌ๊ธฐ๊น์ง ํด๋๊ณ ๋ณด๋, ๋ฉ์ธ๊ด์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ๊ทธ๋ฆผ์๋ฅผ ๋ฐ๋ ๊ธฐ๋ฅ๋ ๋น์ฐํ ์์ด์ผ๊ฒ ๋๋ผ
๊ทธ๋ฆผ์ ๋ฐ๋ ๋ ธ๋ ๋ง๋๋๊ฒ๊น์ง ํด๋ณด๊ธฐ๋ก ํ๋ค
Lighting.hlsl์ย Shadows.hlsl์ ํฌํจํ๋ค
Shadows.hlsl์ ์ ๋ค์ ธ๋ณด๋ฉดย MainLightRealtimeShadowAttenuation ์ด๋ผ๋ ํจ์๊ฐ ์๋๋ฐ, ์๋ ScreenPosition์ ๋ฐ์์ half๋ฅผ ๋ฆฌํดํ๋ค
ScreenPosition ๋ ธ๋๋ ์์ด๋๊ทธ๋ํ์ ์ด๋ฏธ ์์ผ๋๊น, ๋งค์ฐ ๊ฐ๋จํ๋ค
{
#ifdef LIGHTWEIGHT_LIGHTING_INCLUDED
ย ย Atten = MainLightRealtimeShadowAttenuation(ScreenPos);
#else
ย ย Atten = 1;
#endif
}
๋
์๋๋ค
????
์์ฑ๋ ์ฝ๋๋ฅผ ํ์ธํด๋ณด๋ฉด ์์ ์๋๋ฐ,
Shadows.hlsl์์๋ ์ฃผ๊ตฌ์ฅ์ฐฝ #if !defined(_SHADOWS_ENABLED) ์ด๋ฐ ์กฐ๊ฑด์ ๊ฑธ๊ณ ์๋ค
๊ทธ๋ฐ๋ฐ ์์ฑ๋ ์ฝ๋์ย _SHADOWS_ENABLED ๋ฉํฐ์ปดํ์ผ ํ๋ผ๊ทธ๋ง๊ฐ ์๋ค
์์ด๋๊ทธ๋ํ๋ ํ ํ๋ฆฟ ํ์ผ์ ์ด์ฉํ์ฌ ์์ด๋์ฝ๋๋ฅผ ์์ฑํ๋ค
lightweightPBRForwardPass.template ์๋ย #pragma multi_compile _ _SHADOWS_ENABLED ๋ผ์ธ์ด ์กด์ฌํ๋ค
๊ทธ๋ฌ๋ lightweightUnlitPass.template ์๋ ๊ทธ ๋ผ์ธ์ด ์กด์ฌํ์ง ์๋๋ค
multi_compile ์ต์ ์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ย _SHADOWS_ENABLED ํ๋๊ทธ๊ฐ ์ผ์ ธ๋ ์๋ฌด์ผ๋ ์ผ์ด๋์ง ์๋ ๊ฒ์ด๋ค
์ค์ ๋ก ์ธ์คํํฐ์์ Unlit ์์ด๋๊ทธ๋ํ์ Compiled Code๋ฅผ ํ์ธํด๋ณด๋ฉด, Current Graphic device๋ง ์ฒดํฌํ์ ๋ย variant ์ซ์๊ฐ 4๋ค
fog on/off, instancing on/off๊ฐ ์ต์ ์ ์ ๋ถ์ธ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋๊น 2x2=4์ข ๋ฅ๋ฐ์ ์์ฑ์ด ์๋๋ค
๋ฐ๋ฉด์ PBR ์์ด๋๊ทธ๋ํ๋ ๋ง์คํฐ๋ ธ๋ ํ๋๋ง ๋จ๋ ๋๊ณ ๋ด๋ ๋ช๋ฐฑ์ข ์ด ์์ฑ๋จ
๊ทธ๋ผ ์ด๋ป๊ฒย #pragma multi_compile _ _SHADOWS_ENABLED ๋ฅผ ์ถ๊ฐํ๋?
ํ์ฐธ๋์ ์์ด๋์ฝ๋ ์์ฑํ๋ ๋ถ๋ถ์ ๋ค์ ธ๋ดค๋๋ฐ,ย
CodeFunctionNode ํด๋์ค์ย IGeneratesBodyCode.GenerateNodeCode ๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ๋ฉด ShaderGenerator์ย AddPragmaChunk ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค
์ด๊ฑธ ์ฌ์ฉํ๋ฉด
๋ ์ค ์์๋ค
์๋จ. ์ ๋ํฐ๋๋ค์ด ๋ง๋ค๋ค ๋ง ์ฝ๋๋ผ์ ์๋ฌด๋ฐ์๋ ํธ์ถ์ด ์๋๋ค
๋ต์ ์์ธ๋ก ๊ฐ๋จํ๋๋ฐ
์๋ฌด๋ฐ๋ ์ฐ๋ฉด ๋๋ค
ํจ์ ๋ค์ ์ฐ๋ฉด ์๋ํ๋๋ผ
{
#ifdef LIGHTWEIGHT_LIGHTING_INCLUDED
ย ย Atten = MainLightRealtimeShadowAttenuation(ScreenPos);
#else
ย ย Atten = 1;
#endif
}
#pragma multi_compile _ _SHADOWS_ENABLED
#pragma multi_compile _ _SHADOWS_SOFT
#pragma multi_compile _ _SHADOWS_CASCADE
๋ณ์ ๊ฐ์ง๋ง ๋จ
์ฌ๊ธฐ๊น์ง ํ๋๊น ํ ์คํธ์ฉ ์์ด๋๊ทธ๋ํ๋ ์ด๋ฐ ๋ชจ์์ด ๋๋ค
๊ทธ๋ฆฌ๊ณ ํ๋ฉด์๋ ์ด๋ ๊ฒ ๋์จ๋ค
(๋ ธ๋ ๊ณต์ด ์์ด๋ ์ ์ฉ๋๊ฑฐ)
"์กด๋ ๋ณ๊ฑฐ ์๋๋ฐ? ์ด๊ฑฐ ๋ง๋๋๋ผ ์ด๋ ๊ฒ ๊ณ ์ํ์?"
์ ์์ด๋๊ทธ๋ํ ๋ณ์ ์ด๋๋ผ...
LWRP HWRP๊ฐ ๊ธฐ๋ณธ์ด PBR๋ก ์ฐ๊ฒ ๋ค๋๊ฑฐ์๋์์ฌ?(์ง๋ฌธ) SRP์ ์ปค์คํ ๋ชจ๋๊ฐ์๋ค๊ณ ํ๊ฒ๊ฐ์๋ฐ
pbr๋ง ๊ฐ์ง๊ณ ๋ง๋ค์์๋๊ฑด ๊ต์ฅํ ์ ํ์ ์ด์์. (๊ด์์ ๋ณด๋จผ ์์ผ๋ฉด ํ๋ง์ ์ด ๊ฐ๋ฅํ๊ธด ํ์ง๋ง์) Lwrp hdrp์ ์ด๋ค ์์ด๋๋ฅผ ์ฌ์ฉํ ๊ฑฐ๋์ ๋ํ๊ฒ ์๋๋ผ, ์ด๋ป๊ฒ ์ปฌ๋ง์ ํ๊ณ ์ด๋ป๊ฒ ํจ์จ์ ์ผ๋ก ์์ด๋์ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ ๊ฑฐ๋์ ๋ํ๊ฑฐ๋ผ๊ณ ๋ณด๋ฉด ๋ ๋ง์๊ฒ๋๋ค.
๊ทธ๋ ๊ตฐ์ ๊ฐ์ฌํฉ๋๋ค
์๋ง ๊ด์์ชฝ ๋ฐ์ดํฐ๋ค๋ ๋์ค์ ์์ด๋ ๊ทธ๋ํ ์์ ์ถ๊ฐ๋ ๊ฑฐ๋ผ๊ณ ๋ด ๋๋ค. ๋ฒํ ์ค ์ ๋๋ฉ์ด์ ๊ด๋ จ ๋ฐ์ดํฐ๋ ๋ค์ด์จ์ง ์ด์ ๋ง 1~2๊ฐ์์ฏค ๋์... ์์ง ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ถฐ์ผ ํ ๋ฐ์ดํฐ๋ค์ด ๋ง๊ฑฐ๋ ์. ๊ทธ๊ฒ๋ค ๋ค ๋ฃ๊ณ ๋๋ฉด ์๋ง ์ต์ข ์ ์ผ๋ก ์ปค์คํ ๋ผ์ดํ ์ชฝ ๋ฐ์ดํฐ๋ ์์ด๋ ๊ทธ๋ํ์ ์ถ๊ฐ๋ ๊ฒ ๊ฐ์์.