ํ•œ์ค„์š”์•ฝ : ์‰์ด๋”๊ทธ๋ž˜ํ”„ ๋ณ‘์‹ ์ž„


--------------------------------------------------------------


์œ ๋‹ˆํ‹ฐ 2018 ๋“ค์–ด์˜ค๋ฉด์„œ ๋‹ค๋“ค ์Šคํฌ๋ฆฝํ„ฐ๋ธ” ๋ Œ๋” ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ๋Œ€ํ–ˆ์„๊ฑฐ๋ผ ์ƒ๊ฐํ•จ

์™€! ์ปฌ๋ง! ๋“œ๋กœ์ž‰! ๋“œ๋””์–ด ๋ธ”๋ž™๋ฐ•์Šค๊ฐ™๋˜ ๋นŒํŠธ์ธ ๋ Œ๋” ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ฒ—์–ด๋‚˜๋Š”๊ตฌ๋‚˜! ์ด์ œ ๋‚˜์˜ ๊ทธ๋ž˜ํ”ฝ์Šค ์‹ค๋ ฅ์„ ๋ฝ๋‚ผ๋•Œ๊ฐ€ ๋œ๊ฑฐ์•ผ!


๋Š” ๊ฟˆ์ด๊ณ  ์†Œ์Šค ๊นŒ๋ณด๋‹ˆ๊นŒ ๋ญ”์†Œ๋ฆฐ์ง€ ํ•˜๋‚˜๋„ ๋ชจ๋ฅด๊ฒ ๋”๋ผ

๊ทธ๋ž˜์„œ ๊ฑ ใ…Žใ…Ž... LWRP(์œ ๋‹ˆํ‹ฐ๊ฐ€ ์ œ๊ณตํ•˜๋Š”๊ฑฐ. ๊ฒฝ๋Ÿ‰ ๋ Œ๋” ํŒŒ์ดํ”„๋ผ์ธ)์„ ์จ๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค


LWRP๊ฐ€ ๊ฐ•์กฐํ•˜๋Š”๊ฑด ํฌ๊ฒŒ ๋‘๊ฐ€์ง€์ž„


1. ๋ชจ๋ฐ”์ผ/VR ๊ธฐ๊ธฐ์—์„œ ์งฑ ๋น ๋ฅธ ์„ฑ๋Šฅ

2. ๊ด‘์› ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์‹ฑ๊ธ€ํŒจ์Šค๋กœ ์ฒ˜๋ฆฌํ•ด์„œ ๋“œ๋กœ์šฐ์ฝœ ์ตœ์†Œํ™”

3. ์‰์ด๋”๊ทธ๋ž˜ํ”„๋กœ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์‰์ด๋” ๋งŒ๋“ค๊ธฐ


์จ๋†“๊ณ  ๋ณด๋‹ˆ ์…‹์ด์ง€๋งŒ ์•„๋ฌดํŠผ ๋‚˜๋Š” 3๋ฒˆ์„ ์จ๋ณด๊ณ  ์‹ถ์—ˆ๋‹ค

์ง€๊ธˆ ํ•˜๊ณ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋Š” ๋ฉ”์ธ๊ด‘์› ์œ„์ฃผ๋ผ์„œ 2๋ฒˆ์ด ๋ณ„ ํ•„์š”๊ฐ€ ์—†์—ˆ๊ณ , 1๋ฒˆ์€ ๋ฒค์น˜๋งˆํฌ ํ•˜๊ธฐ ์ „๊นŒ์ง„ ๋ชจ๋ฅด๋Š”๊ฑฐ์ž–์•„

๊ด€๋ จ ์ด๋ฏธ์ง€

(์‰์ด๋”๊ทธ๋ž˜ํ”„๋Š” ๋Œ€์ถฉ ์ด๋Ÿฐ ๊ธฐ๋Šฅ์ž„. ๋…ธ๋“œ ์—ฐ๊ฒฐํ•ด์„œ ์‰์ด๋” ์งœ๋Š”๊ฑฐ)


๊ทผ๋ฐ LWRP ์ ์šฉํ•œ ์ƒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , ์‰์ด๋”๊ทธ๋ž˜ํ”„๋ฅผ ์—ด์–ด๋ณด๋‹ˆ๊นŒ


๋ ์šฉ

Unlit์— ๊ด‘์› ๋ฐ›์•„์˜ค๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๋‹ค


์ด๋ง์ธ์ฆ‰ ๋žจ๋ฒ„ํŠธ๋‚˜ ํ•˜ํ”„๋žจ๋ฒ„ํŠธ, ํˆฐ ์‰์ด๋”ฉ, ๋ธ”๋ฆฐํ ๋“ฑ๋“ฑ์„ ๋‚ด๋ง˜๋Œ€๋กœ ์„ค์ •ํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š”๊ฑฐ์ž„

๋ฌด์กฐ๊ฑด ๋ช…์•”์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ ค๋ฉด ๋ฌผ๋ฆฌ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง์„ ํ•˜๊ฑฐ๋‚˜, ์‰์ด๋”๊ทธ๋ž˜ํ”„ ๋•Œ๋ ค์น˜๊ณ  ์ง์ ‘ ์ฝ”๋“œ ์งœ๋ž€ ์†Œ๋ฆฌ์ž„


๋ ์š”์šฉ?


๊ทผ๋ฐ ์ข€ ์ฐพ์•„๋ณด๋‹ˆ ์œ ๋‹ˆํ‹ฐ ์–˜๋„ค๊ฐ€ ์ข€ ๋ชจ์ž๋ผ์„œ ์ด๊ฑธ ์•ˆ๋งŒ๋“ค์–ด๋†“๊ธด ํ–ˆ๋Š”๋ฐ, ๋งŒ๋“ค ๋ฐฉ๋ฒ•์€ ๋งˆ๋ จํ•ด๋†“์€๊ฑฐ ๊ฐ™๋”๋ผ

C# ์Šคํฌ๋ฆฝํŠธ๋กœ ์ปค์Šคํ…€ ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ๋‹ค string์œผ๋กœ ์‰์ด๋” ์ฝ”๋“œ๋ฅผ ์จ๋†“์„ ์ˆ˜ ์žˆ์Œ


09


๊ทธ๋Ÿผ ํ•ด๊ฒฐ์ฑ…์€ย ๊ฐ„๋‹จํ•˜๋‹ค


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


๋ณ‘์‹ ๊ฐ™์ง€๋งŒ ๋จ


์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋‹ˆ๊นŒ ํ…Œ์ŠคํŠธ์šฉ ์‰์ด๋”๊ทธ๋ž˜ํ”„๋Š” ์ด๋Ÿฐ ๋ชจ์–‘์ด ๋๋‹ค


viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73fef8efa11d02831ff8a84a4b499fa798f2b758278147511a92edebe5f99113fc4c10e553c6412acec56b63d90dc20c9c3672a16e6e3ed9340c1d5


๊ทธ๋ฆฌ๊ณ  ํ™”๋ฉด์—๋Š” ์ด๋ ‡๊ฒŒ ๋‚˜์˜จ๋‹ค



viewimage.php?id=2abcdd23dad63db0&no=24b0d769e1d32ca73fef8efa11d02831ff8a84a4b499fa798f2b758278147511a92edebe5f99113f82925933386012a070d4d3529e8032c8964ff180167e2f

(๋…ธ๋ž€ ๊ณต์ด ์‰์ด๋” ์ ์šฉ๋œ๊ฑฐ)




"์กด๋‚˜ ๋ณ„๊ฑฐ ์•„๋‹Œ๋ฐ? ์ด๊ฑฐ ๋งŒ๋“œ๋А๋ผ ์ด๋ ‡๊ฒŒ ๊ณ ์ƒํ–ˆ์Œ?"


์‘ ์‰์ด๋”๊ทธ๋ž˜ํ”„ ๋ณ‘์‹ ์ด๋”๋ผ...