1. ์ฅ๋ฉด ๊น์ด ๋ ๋๋ง
๊ด์์ ์์ ์์ ๋ณธ ์ฅ๋ฉด์ ๊น์ด๋ฅผ ๋ ๋๋งํ๋ ๊ณผ์ ์ด ์๋ค. ์ด๋ ํ ์ค์ฒ ๋์ ๋ ๋๋ง ( render - to - texture )์ ์ผ์ข ์ด๋ฉฐ, ๊ด์์ ์์ ์์ ๋ณธ ์ฅ๋ฉด์ ๊น์ด ๊ฐ๋ค์ ๊น์ด ๋ฒํผ์ ๊ธฐ๋กํ๋ ๊ฒ์ ๋ปํ๋ค.
๊ทธ๋ฆผ์ ๋งคํ ์๊ณ ๋ฆฌ์ฆ์๋ ๋ ๋ฒ์ ๋ ๋๋ง ํจ์ค๊ฐ ํ์ํ๋ค.
- ๊ด์์ ์์ ์์ ๋ณธ ์ฅ๋ฉด ๊น์ด๋ฅผ ๊ทธ๋ฆผ์ ๋งต์ ๋ ๋๋ง
- ํ๋ ์ด์ด ์นด๋ฉ๋ผ์์ ๋ณธ ์ฅ๋ฉด์ ํ๋ฉด ๋ฒํผ์ ๋ ๋๋ง
2. ์ง๊ต ํฌ์/์ ์ฌ์ (Orthographic_Projection)
๊ทธ๋ฆผ์ ๋งคํ์์ ํํ ๊ด์ด ๋ง๋ค์ด ๋ด๋ ๊ทธ๋ฆผ์๋ฅผ ๋ณธ๋ฐ๋ ์ง๊ต ํฌ์์ด ํ์ํ๋ค.
(2.1). ์ง๊ต ํฌ์ ํ๋ ฌ ๊ตฌํ๊ธฐ (orthogonal_projection_matrix)
๋ฒกํฐ๋ฅผ ํน์ ๋ฒกํฐ ๊ณต๊ฐ ๋๋ ๋ถ๋ถ ๊ณต๊ฐ์ ์ง๊ต์ ์ผ๋ก ํฌ์ํ ๋ ์ฌ์ฉํ๋ ํ๋ ฌ์ด๋ค. ์นด๋ฉ๋ผ๊ฐ ๋ณด์ฌ์ฃผ๋ ์ผ๋ถ ๊ณต๊ฐ์ ์ ๋์ฒด(frustum)๋ผ๊ณ ํ๊ณ , ์นด๋ฉ๋ผ๋ ์ ๋์ฒด ๋ด๋ถ์ ์ขํ๋ค์ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ฉด ์์์ ๋ณด๋ ํด์๋ ์์ญ์ ํด์๋์ ๋ฐ๋ผ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ ๊ทํํ ํ์๊ฐ ์๋ค. ์ด๋ฅผ ์ ๊ทํํ ๊ณต๊ฐ์ NDC(Normalized Display Coordinate) ๊ณต๊ฐ์ด๋ผ๊ณ ํ๋ค.
3. ๊ทธ๋ฆผ์ ๋งคํ ์๊ณ ๋ฆฌ์ฆ
(3.1). ๊ทธ๋ฆผ์ ๋งต ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ค. -- Build Resource( )
D3D12_RESOURCE_DESC ๋ฅผ ์ฑ์ด ํ CreateCommittedResource ํจ์ ํธ์ถ
๊ทธ๋ฆผ์ ๋งต์ ์ ์ฅํ ํ ์ค์ฒ ๋ฆฌ์์ค์ ๊น์ด ์คํ ์ค ๋ทฐ๋ฅผ ์์ฑํ๋ค.
(3.2). Depth Stencil View (DSV) ์์ฑํ๋ค. -- Build Descriptors( )
D3D12_DEPTH_STENCIL_VIEW_DESC ์ฑ์ด ํ CreateDepthStencilView ํจ์ ํธ์ถ
(3.3) ๋น์ ๊ด์ ์์ ๊น์ด๋งต ๋ ๋
๊ธฐ์กด ์ค๋ธ์ ํธ ๋ ๋๋ '์นด๋ฉ๋ผ' ๊ธฐ์ค์ผ๋ก ๋ ๋๋ง์ ํ๋ค๋ฉด, ๊ทธ๋ฆผ์๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด์๋ '๋น'์ ๊ด์ ์์ ์ฅ๋ฉด์ ๊น์ด ์ ๋ณด๋ฅผ ๋ ๋๋งํ์ฌ ๊ทธ๋ฆผ์ ๋งต์ ๋ง๋ ๋ค
- ์ง๊ต ํฌ์(Orthographic Projection)์ ํ์๊ณผ ๊ฐ์ ํํ๊ด์ ์ ํฉํ ํฌ์
- ์๊ทผ ํฌ์ (Perspective Projection)์ ์ ๊ด์ ์ ํฉํ ํฌ์
(3.4) ๊น์ด๋งต ๋ ๋๋ง
- ๊ธฐ์กด ๋ ๋ ํ๊ฒ์ ๊ทธ๋ฆผ์ ๋งต์ ๊น์ด ์คํ ์ค ๋ทฐ๋ก ์ค์ ํ๋ค.
- ๋น์ ๋ทฐ-ํฌ์ ํ๋ ฌ์ ๊ธฐ๋ฐ์ผ๋ก ์ฅ๋ฉด์ ๋ ๋๋ง ํ ๊น์ด ์ ๋ณด๋ฅผ ๊ทธ๋ฆผ์๋งต์ ์ ์ฅํ๋ค.
(3.5) '์นด๋ฉ๋ผ' ๊ธฐ์ค์ผ๋ก ๋ค์ ๋ ๋๋ง
- ๋ฉ์ธ ์นด๋ฉ๋ผ์ ๊ด์ ์์ ์ฅ๋ช ์ ๋ ๋๋งํ๋ค
- ๊ทธ๋ฆผ์ ๋งต์ ์ํ๋งํ์ฌ ๊ทธ๋ฆผ์๋ฅผ ๊ณ์ฐํ๋ค.
- ๊ทธ๋ฆผ์ ์ ๋ณด๋ฅผ ์กฐ๋ช ๋ชจ๋ธ๊ณผ ํตํฉํ์ฌ ์ต์ข ์ด๋ฏธ์ง๋ฅผ ์์ฐํ๋ค.
4. ๊ทธ๋ฆผ์ ๋งต ํ์
'๋น'์ ๊ด์ ์์ ์ฅ๋ฉด์ ๋ ๋๋งํด์ ๊ทธ๋ฆผ์ ๋งต์ ๋ง๋ ํ, '์นด๋ฉ๋ผ' ๊ด์ ๋ ๋๋ง์์ ๊ทธ๋ฆผ์ ๋งต์์ ํ๋ณธ์ ์ถ์ถํ์ฌ ํ์ฌ ํฝ์ ์ด ๊ทธ๋ฆผ์ ์์ ์๋์ง๋ฅผ ์ฌ๋ถ๋ฅผ ํ์ ํ๋ค.
- ์นด๋ฉ๋ผ ๊ด์ ์์ ๋ฐ๋ผ๋ณด๋ ๊ณต๊ฐ์ ์ ์ P1, P2
- ๋น์ ๊ด์ ์์ P1, P2๊น์ง์ ๊ฑฐ๋ฆฌ๋ฅผ d1, d2
- ๊ทธ๋ฆผ์๋งต์ ์ ์ฅ๋ P1, P2 ์์น์ ๊น์ด ๊ฐ z1, z2
์์ ๊ฐ์ ์ํฉ์์
d์ z ๊ด๊ณ๊ฐ d <= z ์ด๋ฉด ์ฐธ(๊ทธ๋ฆผ์๋ฅผ ๊ทธ๋ฆฌ์ง ์๋๋ค.), d > z (๊ทธ๋ฆผ์๋ฅผ ๊ทธ๋ ค์ผ ํ๋ค.)์ด๋ฉด ๊ฑฐ์ง์ผ๋ก ํ์ ํ ์ ์๋ค.
์ฝ๋๋ฅผ ํ๋ํ๋ ๋ณด์.
shadowPosH.xyz /= shadowPosH.w;
shodowPosH๋ ๋น์ ๋ทฐํ๋ฌ์คํ ํ๋ ฌ์ ์ ์ฉํ ์ขํ์ด๋ค. ์ด๋ฅผ ์ด์ฉํ์ฌ ๋น์์ p1,p2๋ฅผ ๋ฐ๋ผ๋ณด๋ d1, d2๋ฅผ ์์๋ธ๋ค.
float depth = shadowPosH.z;
ํ์ฌ ํฝ์ ์ ๊น์ด๊ฐ d1, d2
uint width, height, numMips;
gShadowMap.GetDimensions(0, width, height, numMips);
๊ทธ๋ฆผ์๋งต : gShadowMap
float dx = 1.0f / (float)width;
ํ ์ ํฌ๊ธฐ: 1.0/ ํ ์ค์ฒ ํญ
const float2 offsets[9] =
{
float2(-dx, -dx), float2(0.0f, -dx), float2(dx, -dx),
float2(-dx, 0.0f), float2(0.0f, 0.0f), float2(dx, 0.0f),
float2(-dx, +dx), float2(0.0f, +dx), float2(dx, +dx)
};
์คํ์ ฏ ๊ตฌํ๊ธฐ ์ด๋ ๊ทธ๋ฆผ์ ๋งต ์ํ๋ง์ ๊ทธ๋ฆผ์ ๊ฒฝ๊ณ๋ฅผ ๋ถ๋๋ฝ๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ค์ฌ ํ ์ ์ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ ํ ์ ์ ํจ๊ป ์ํ๋งํ๋ ์ฝ๋์ด๋ค.
[unroll]
for(int i = 0; i < 9; ++i)
{
percentLit += gShadowMap.SampleCmpLevelZero(gsamShadow,
shadowPosH.xy + offsets[i], depth).r;
}
SampleCmpLevelZero ๋น๊ต ์ํ๋ง ํจ์์ด๋ค.
shadowPosH.xy + offsets[i] depth, depth๋ผ๊ณ ๋์ด์๋๋ฐ ์ด๋ gShadowMap์ ์ด๋ฏธ ์ ์ฅ๋ shadowPosH.xy + offsets[i]์ด ์์น์ ๊น์ด ๊ฐ๊ณผ ํ ์ depth์ ๋น๊ตํ๋ค๋ ๋ป์ด๋ค.
โป shadowmap๊ณผ depth ์ฐจ์ด์
- shadowmap : ๋น์ ๊ด์ ์์ ๋ ๋๋ง ๋ ๊น์ด๋งต
- depth ํ์ฌ ํ๋ฉด ํฝ์ ๋น์ ๊ด์ ๊น์ด๊ฐ
return percentLit / 9.0f;
์์์ 9๊ฐ์ ์คํ์ ์์น์์ ๊ฐ์ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ํ๊ท ๊ฐ์ ์ํด 9.0f๋ฅผ ๋๋ ์ค๋ค.
5. PSO์ Draw์์ ์ ๊ฒฝ ์จ์ผ ํ ๋ถ๋ถ ์ ๋ฆฌ
๊ทธ๋ฆผ์ ๊ทธ๋ฆด ๋๋ ๊ทธ๋ฆผ์ ๋งต์ ๋ฐ๋ก ๊ทธ๋ ค์ค์ผ ํ๋ฏ๋ก ์ ๊ฒฝ ์จ์ค ๊ฒ ์กฐ๊ธ ๋ง์๋ค. ์ ๋ฆฌํด ๋ณด์ ~
(5.1). DSV DescriptorHeap ๊ฐ์ ์ฆ๊ฐ
๊ทธ๋ฆผ์ ๋งต์ฉ ๋ฒํผ๋ฅผ ์ถ๊ฐ๋ก ๋ง๋ค์ด์ค์ผ ํ๋ค. ๊ธฐ์กด์๋ ๊น์ด/์คํ ์ค ๋ฒํผ ํ๋๋ง ๊ฐ์ง๊ณ ์์๋ค.
D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc;
dsvHeapDesc.NumDescriptors = 2;
dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
dsvHeapDesc.NodeMask = 0;
ThrowIfFailed(md3dDevice->CreateDescriptorHeap(
&dsvHeapDesc, IID_PPV_ARGS(mDsvHeap.GetAddressOf())));
(5.2) ๊ทธ๋ฆผ์ ๋งต์ ๋ ๋ ํ์ผ์ ์ฌ์ฉํ์ง ์์
mCommandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(mShadowMap->Resource(),
D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_DEPTH_WRITE));
UINT passCBByteSize = d3dUtil::CalcConstantBufferByteSize(sizeof(PassConstants));
mCommandList->ClearDepthStencilView(mShadowMap->Dsv(), D3D12_CLEAR_FLAG_DEPTH | D3D12_CLEAR_FLAG_STENCIL, 1.0f, 0, 0, nullptr);
mCommandList->OMSetRenderTargets(0, nullptr, false, &mShadowMap->Dsv());
OMSetRenderTargets(0, nullptr, false, &mShadowMap->Dsv());
๋ ๋ ํ๊น์ ์ธํ
ํ์ง ์๋๋ค๋ ๊ฒ์ ์ปฌ๋ฌ๊ฐ์ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์ฒซ ๋ฒ์งธ ์ธ์ 0์ ๋ ๋ ํ๊น์ ์ ์ง ์๋๋ค๋ ๋ป์ด๋ค. ์ค์ง ๋์ค ๋ฒํผ๋ง ๊ทธ๋ฆฐ๋ค.
mCommandList->ResourceBarrier ํธ์ถ์ ๋ฆฌ์์ค ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ์ญํ ์ ํ๋ค.
(5.3) ๊ทธ๋ฆฌ๋ ๊ณต๊ฐ์ด ๋ค๋ฅด๊ธฐ(์นด๋ฉ๋ผ ๊ด์ , ๋น ๊ด์ ) ๋๋ฌธ์ ์ค์ ๋ค์ ๋ชจ๋ ๊ฐฑ์ ํด ์ค์ผ ํ๋ค.
- ViewPorts
- ScissorRects
- ClearDepthStencilview
- OMSetRenderTargets
- ์์ ๋ฒํผ
- ResourceBarrier
- pso
๋ค์ ์นด๋ฉ๋ผ ๊ด์ ์์ ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ๋ ๋น ์ง ๊ฒ ์๋ค๋ฉด ์์ ํด ์ค์ผ ํ๋ค.
๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๊ธฐ ์ฝ์ง ์์๋ค. ํ๋ก์ ํธ ๋ณต๋ถ์ด ์๋๋ผ ๊ธฐ์กด ํ๋ก์ ํธ ๊ธฐ๋ฅ์ ์ ์งํ๋ฉด์ ๊ธฐ๋ฅ์ ๋ฃ์ผ๋ ์ดํดํด์ผ ๋ฃ์ ์ ์์๋ค.
๋ฌดํผ .. ์ฌ๋ฏธ์์์ ~~ ๊ทธ๋ผ ๋ค์์ ๋ ์ค๊ฒ ์ต๋๋ค.
![](https://t1.daumcdn.net/keditor/emoticon/challenge/large/005.png)
์ฑ๋ฆฐ์ง์์ ๋ฐ์๊ฑด ์ด ๊ท์ฌ์ด ์ํฐ~ใ ใ ๋๋ฌด ๊ฒ์๋ฌ์ ์ฑ๋ฆฐ์ง ์ฐธ์์ ๊ฑฐ์ ๋ชปํ๋ค.. ๋ค์์ ๋ ๊ธฐํ๊ฐ ์๋ค๋ฉด ์ ๋๋ก ํด๋ณด๊ณ ์ถ๋ค.
'๐ฏ game engine > โฝ directX12' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DirectX12] ํ๋ธ๋งต ๋ง๋ค๊ธฐ / StructuredBuffer (0) | 2024.11.26 |
---|---|
[DirectX12] ์คํ ์ค(stencil) ๊ฑฐ์ธ ๋ง๋ค๊ธฐ (0) | 2024.11.07 |
[DirectX12] ์กฐ๋ช ์ ์ข ๋ฅ (0) | 2023.12.19 |
[DirectX12] ์กฐ๋ช ์ฐ์ฐ์ ์ํ ๋ฒ์ ๋ฒกํฐ, ๋ฒ์ ๋ฒกํฐ์ ๋ณํ (0) | 2023.12.14 |
[DirectX12] ์๊ธฐ๋ฅ์ ์ ์ ์ฐ๊ธฐ/๋ ๋๋ง ๊ณผ์ ์ดํดํ๊ธฐ (1) | 2023.12.12 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!