Quick Flow
text
ignore or defer zero-sized/minimized window
-> OMSetRenderTargets(0, nullptr, nullptr)
-> release RTV, DSV, back-buffer references
-> swapChain->ResizeBuffers(...)
-> GetBuffer and recreate RTV
-> recreate size-dependent depth texture and DSV
-> update viewport and projection aspect ratioSwap-chain buffer를 참조하는 view나 Context binding이 하나라도 남으면 ResizeBuffers가 실패할 수 있습니다.
크기 의존 자원
Back buffer RTV뿐 아니라 depth texture, DSV, MSAA target, post-process intermediate target, screen-space effect history가 window 크기에 의존할 수 있습니다. 한 함수에서 size-dependent resource를 함께 재생성하면 누락을 줄일 수 있습니다.
cpp
context->OMSetRenderTargets(0, nullptr, nullptr);
renderTargetView.Reset();
depthStencilView.Reset();
depthTexture.Reset();
ThrowIfFailed(swapChain->ResizeBuffers(0, width, height, DXGI_FORMAT_UNKNOWN, flags));ResizeBuffers의 0 width·height 의미는 사용하는 DXGI interface 버전을 확인합니다. SwapChainFlags에는 새 buffer가 가져야 할 flag 조합을 전달하며, tearing을 사용한다면 생성 때와 마찬가지로 DXGI_SWAP_CHAIN_FLAG_ALLOW_TEARING을 포함합니다. Minimize 중 0 크기 요청은 render를 건너뛰고 유효한 크기가 돌아왔을 때 재생성하는 편이 안전합니다.
자주 틀리는 점
- Viewport만 바꾸고 실제 back buffer와 depth target 크기를 그대로 두지 않습니다.
- Projection matrix aspect ratio 갱신을 빠뜨리지 않습니다.
- GPU가 참조 중인 자원 수명은 runtime synchronization과 Debug Layer 메시지로 확인합니다.
- 매
WM_SIZE중간 값마다 무거운 자원을 반복 생성할지 resize 종료 시점으로 지연할지 UX와 비용을 검토합니다.
참고 링크
1 sources