1. ์คํ ์ค ๋ฒํผ Stencil Buffer
๐ธ ํน์ง
- ์คํ ์ค ๋ฒํผ๋ ํ๋ฉด ๋ฒํผ ๋ฐ ๊น์ด ๋ฒํผ์ ํด์๋๊ฐ ๊ฐ๋ค.
- ์คํ ์ค ๋ฒํผ๋ฅผ ์ง์ ํ๋ฉด ๊ทธ ์คํ ์ค ๋ฒํผ๋ ๊น์ด ๋ฒํผ์ ๋ถ์ฐฉ๋๋ค.
- ํฝ์ ๋จํธ๋ค์ด ํ๋ฉด ๋ฒํผ์ ๊ธฐ๋ก๋์ง ๋ชปํ๊ฒ ํ๋ ์ญํ ์ ํ๋ค.
- CD3DX12_DEPTH_STENCIL_DESC๊ตฌ์กฐ์ฒด ์ฑ์ฐ๊ณ , D3D12_GRAPHICS_PIPELINE_STATE_DESC ์ค์ ํ๋ค.
2. ์คํ ์ค ํ์
์คํ ์ค ๋ฒํผ๋ฅผ ์ด์ฉํ๋ฉด ์ฅ๋ฉด์ด ํ๋ฉด ๋ฒํผ์ ํน์ ์์ญ์๋ง ๋ ๋๋ง๋์ง ์๊ฒ ๋ง๋ค์ ์๋ค. ์คํ ์ค์ ์ ์ฉํ๋ ๊ฒฝ์ฐ, ์ฃผ์ด์ง ํ ํฝ์ ์ด ํ๋ฉด ๋ฒํผ์ ๊ธฐ๋ก๋๋์ง ์๋์ง๋ ์คํ ์ค ํ์ ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค. ์คํ ์ค ํ์ ์ ํฝ์ ์ด ๋์คํฐํ๋๋ ๊ณผ์ ์์, ์ฆ ์ถ๋ ฅ ๋ณํฉ๊ธฐ ๋จ๊ณ์์ ์ผ์ด๋๋ค.
- ํฝ์ ์ ํ์ฉ : ํ๋ฉด ๋ฒํผ์ ๊ทธ๋ฆฌ๊ฒ ๋ค.
- ํฝ์ ์ ๊ธฐ๊ฐ : ํ๋ฉด ๋ฒํผ์์ ์๋ฅด๊ฒ ๋ค.
- value : ์คํ ์ค ๋ฒํผ์ ์ด๋ฏธ ์๋ ํฝ์ ์ ๊ฐ
- stencilRef: ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ง์ ํ ์คํ ์ค ๊ธฐ์ค๊ฐ
- stencilReadMask : ์ข๋ณ ์ฐ๋ณ ๊ฐ์ ๊ฐ์ผ๋ก ๋ง์คํน๊ฐ
3. ๊ฑฐ์ธ ๊ทธ๋ฆฌ๊ธฐ PSO (pipeline_state_object)์ค์์ฝ๋
1) ํ์ดํ๋ผ์ธ ์ค์ ์์ ์คํ ์ค ์ํ ๋ง๋ค์ด์ฃผ๊ธฐ.
- ๊ฑฐ์ธ ํฝ์ ๋ค์ ์คํ ์ค ๋ฒํผ์ ๊ธฐ๋กํ๊ธฐ ์ํด ๊ฑฐ์ธ์ ๋ ๋๋งํ ๋ ์ฐ๋ pso
mirrorBlendState.RenderTarget[0].RenderTargetWriteMask = 0;
์์ ์ฑ๋ถ๋ค์ด ํ๋ฉด ๋ฒํผ์ ๊ธฐ๋ก๋์ง ์๋๋ค.
mirrorDSS.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ZERO;
๊น์ด ๋ฒํผ ์ฐ๊ธฐ๊ฐ ๋นํ์ฑํ ๋๋ค.
mirrorDSS.FrontFace.StencilFunc = D3D12_COMPARISON_FUNC_ALWAYS;
๊ฑฐ์ธ์ ์คํ ์ค ๋ฒํผ์ ๋ ๋๋งํ ๋์๋ ์คํ ์ค ํ์ ์ด ํญ์ ์ฑ๊ณต(ํต๊ณผ)ํ๋๋ก ๋น๊ตํจ์๋ฅผ alway๋ก ์ค์ ํ๋ค.
mirrorDSS.FrontFace.StencilPassOp = D3D12_STENCIL_OP_REPLACE;
ํ์ ์ฑ๊ณต์ ๊ธฐ์กด ์คํ ์ค ํญ๋ชฉ์ด ํญ์ 1๋ก ๋์ฒด๋๋๋ก StencilRef๋ฅผ 1๋ก, ๋น๊ต์ฐ์ฐ์๋ฅผ D3D12_STENCIL_OP_REPLACE๋ก ์ง์ ํ๋ค.
mirrorDSS.BackFace.StencilDepthFailOp = D3D12_STENCIL_OP_KEEP;
๊น์ด ํ์ ์ด ์คํจํด๋ ์คํ ์ค ๋ฒํผ๋ ๋ณํ์ง ์๋๋ค.
- ๋ฐ์ฌ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฑฐ์ธ์ ๊ฐ์์ ๋ถ๋ถ์๋ง ๊ทธ๋ฆด ๋ ์ฌ์ฉ.
reflectionsDSS.BackFace.StencilFunc = D3D12_COMPARISON_FUNC_EQUAL;
์คํ ์ค ๋ฒํผ ํญ๋ชฉ์ด 1์ธ ๊ฒฝ์ฐ์๋ง ํ์ ์ด ์ฑ๊ณตํ๊ฒ ์ค์ ํ๋ค. ์ด๋ฅผ ์ํด stencilref๋ฅผ 1๋ก ์ค์ ํ๊ณ ๋น๊ต์ฐ์ฐ์๋ D3D12_COMPARISON_FUNC_EQUAL๋ก ์ค์ ํ๋ค.
drawReflectionsPsoDesc.PS =
{
reinterpret_cast<BYTE*>(mShaders["alphaTestedPS"]->GetBufferPointer()),
mShaders["alphaTestedPS"]->GetBufferSize()
};
์ฑ ๊ณผ ๋ค๋ฅด๊ฒ ์ํ clip์ด ์ด๋ค์ง ์์๋ฅผ ๋ฐ์ฌ์ํค๊ธฐ ๋๋ฌธ์ alphaTestps๋ฅผ ๋ฃ์ด์ค์ ๋ฐ์ฌ๋ ๋ฌผ์ฒด๋ ์ํ์ฒ๋ฆฌ ๋ ์ ์๊ฒ ํด์ฃผ์๋ค.
4. ๊ฑฐ์ธ ๊ทธ๋ฆฌ๊ธฐ Draw ์ค์์ฝ๋
auto passCB = mCurrFrameResource->PassCB->Resource();
๋ค์ ์์ ๋ฒํผ๋ก ๋์ด ๊ฐ ์์๋๋ก ์์๋ฒํผ ์ฌ์ด์ฆ๋ฅผ ์์๋๋ค.
mCommandList->SetGraphicsRootConstantBufferView(2, passCB->GetGPUVirtualAddress());
// ๋ถํฌ๋ช
ํ ํญ๋ชฉ (๋ฐ๋ฅ, ๋ฒฝ, ์์๋ฑ์ ๊ทธ๋ฆฐ๋ค.)
DrawRenderItems(mCommandList.Get(), mRenderItems[(int)RenderLayer::Opaque]);
์๋ ๊ธฐ๋ณธ ์์๋ฒํผ๋ก ๊ทธ๋ฆผ์ ๊ทธ๋ฆฐ๋ค. ๋ฐ๋ฅ, ๋ฒฝ, ์์, ๊ธฐ๋ฅ๋ฑ๋ฑ
mCommandList->OMSetStencilRef(1);
mCommandList->SetPipelineState(mPSOs["markStencilMirrors"].Get());
DrawRenderItems(mCommandList.Get(), mRenderItems[(int)RenderLayer::Mirrors]);
mRenderItems[(int)RenderLayer::Mirrors] ์ด ์์ดํ ์์๋ ๊ฑฐ์ธ๋ง ์๋ค. OMSetStencilRef ์ค์ ์ผ๋ก ํ์ ์ฑ๊ณต์ 1์ด ๊ธฐ๋ก๋๋ค.
mCommandList->SetGraphicsRootConstantBufferView(2, passCB->GetGPUVirtualAddress() + 1 * passCBByteSize);
mCommandList->SetPipelineState(mPSOs["drawStencilReflections"].Get());
DrawRenderItems(mCommandList.Get(), mRenderItems[(int)RenderLayer::Reflected]);
๋ฐ์ฌ๋ ์กฐ๋ช ์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ํด ์์ ๋ฒํผ๋ฅผ ๋ฐ๊ฟ์ฃผ ๋ฐ์ฌ๋ ์ค๋ธ์ ํธ๋ฅผ ๊ฑฐ์ธ์ ๊ฐ์์ ๋ถ๋ถ์๋ง ๊ทธ๋ฆด ๋ ์ฌ์ฉํ๋ ์ํ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ ๋ฐ์ฌ๋ ๋ฌผ์ฒด๋ฅผ ๊ทธ๋ฆฐ๋ค.
'๐ฏ game engine > โฝ directX12' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DirectX12] ์๋์ฐ ๋งคํ (shadow mapping), ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ ์์ธ ์ ๋ฆฌ (0) | 2024.12.18 |
---|---|
[DirectX12] ํ๋ธ๋งต ๋ง๋ค๊ธฐ / StructuredBuffer (0) | 2024.11.26 |
[DirectX12] ์กฐ๋ช ์ ์ข ๋ฅ (0) | 2023.12.19 |
[DirectX12] ์กฐ๋ช ์ฐ์ฐ์ ์ํ ๋ฒ์ ๋ฒกํฐ, ๋ฒ์ ๋ฒกํฐ์ ๋ณํ (0) | 2023.12.14 |
[DirectX12] ์๊ธฐ๋ฅ์ ์ ์ ์ฐ๊ธฐ/๋ ๋๋ง ๊ณผ์ ์ดํดํ๊ธฐ (1) | 2023.12.12 |
์ ํ๋ ๊ฒ ๋ณด๋ค ๋ซ๊ฒ ์ง
ํฌ์คํ ์ด ์ข์๋ค๋ฉด "์ข์์โค๏ธ" ๋๋ "๊ตฌ๋ ๐๐ป" ํด์ฃผ์ธ์!