프로젝트 회고록

Depth 양은 알 수가 없어

NAEU 2026. 4. 25. 16:26

ref. 아하렌 양은 알 수가 없어

 

한 3일동안 있었던 버그를 잡은 짧은 회고록입니다
렌더링 과정에서 depth test가 이루어지지 않아 그리는 순서대로 위에 그려지는 현상이 있었습니다


우선 view 혹은 projection의 matrix가 제대로 넘어가지지 않나 둘의 depth값을 확인해봤습니다


depth색은 정상적으로 적용되었습니다(멀수록 어둡게)
이때 알아낸 것은 현재 vector에 MeshRenderer를 담고 순차대로 draw를 진행하는데, 이 순차대고 먼저 그려진다는 사실입니다
따라서 depth test 자체가 이루어지지 않고 있다는 것을 의심했습니다


하지만 DepthStencilBuffer 생성도 통과하였고
DepthStencilState도 정상적으로 생성되었습니다
여기서 잠시 막히게 되었지만 결국 원인을 발견하였습니다

DXGI_SWAP_CHAIN_DESC scd;
ZeroMemory(&scd, sizeof(scd));

scd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; //버퍼 설정 중 색상 설정
scd.SampleDesc.Count = 4;
scd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; //스왑체인 사용 방식
scd.BufferCount = 1; //백 버퍼 갯수
scd.OutputWindow = hwnd;
scd.Windowed = TRUE; //창모드

 

D3D11_TEXTURE2D_DESC depthTexDesc{};
depthTexDesc.Width = 800;
depthTexDesc.Height = 800;
depthTexDesc.MipLevels = 1;
depthTexDesc.ArraySize = 1;
depthTexDesc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthTexDesc.SampleDesc.Count = 1;
depthTexDesc.SampleDesc.Quality = 0;
depthTexDesc.Usage = D3D11_USAGE_DEFAULT;
depthTexDesc.BindFlags = D3D11_BIND_DEPTH_STENCIL;


다음은 swapchain을 위한 desc와 depth stencil을 위한 desc입니다
문제는 SampleDesc.Count에 있었습니다


Sample이란 픽셀의 색을 지정할때 부드럽게 하기 위한 방법입니다
픽셀 하나에 대해 N개의 점을 찍어 도형이 해당 점 위를 덮는지 여부를 파악하고, 모든 점들의 평균값을 구하여 해당 픽셀에 적용합니다


그럼 위에서의 정확한 문제는 swapchain과 depthstencil의 count값이 다른것이 였습니다
렌더 파이프라인을 보면 Rasterizer 후에 샘플별로 Pixel Shader를 실행하여 N개의 픽셀값을 구합니다
이후 OutputMerge단계에서 RenderTarget(swapchain)[n]과 depthbuffer[n]을 1:1 비교합니다
기존 픽셀의 depth와 새 depth를 비교하고 새 depth가 더 작다면 rendertarget[n]을 덮어씌우는거죠


하지만 저 갯수가 다르다면 바인딩 자체를 무효화 처리합니다
따라서 갯수의 주체는 RenderTarget입니다

참고로 D3D11_DSV_DIMENSION_TEXTURE2DMS <- 뒤에 MS(multi-sample)이 붙은걸로 view를 만들어야합니다

 

더 나아가보자면 이렇게 갯수를 일일히 동기화하는 것은 관리가 복잡해질 수 있습니다

따라서 TAA나 FXAA같은 방법을 사용한다고 하네요
-> post-processing 방식

 

어떤 변수값이 어떻게 사용되는지 무지한채로 완성에만 급급하여 개발을 하던게 이렇게 돌아오네요

특히 로우레벨/api를 다룰 떄는 항상 유의하며 학습해야겠습니다

'프로젝트 회고록' 카테고리의 다른 글

추락 사각형과 폐인 개발자  (3) 2025.04.14
지뢰인가요? SDL양  (0) 2025.04.08