Quick Flow
create Device + immediate Context + Swap Chain
-> get Back Buffer and create RTV
-> create buffers, shaders, layouts, states
-> bind render target + viewport + pipeline inputs
-> ClearRenderTargetView / ClearDepthStencilView
-> Draw or DrawIndexed
-> IDXGISwapChain::PresentDirect3D 11은 Draw 인자만으로 장면을 설명하지 않습니다. Immediate Context에 현재 연결된 buffer, shader, state, render target을 사용해 명령을 만듭니다.
초기화와 프레임
초기화에서는 오래 재사용할 Device, Swap Chain, render target, shader, mesh resource와 state object를 만듭니다. 매 frame에는 변하는 constant data를 갱신하고 필요한 pipeline binding을 설정한 뒤 draw call을 제출합니다.
const float clearColor[4] = { 0.04f, 0.05f, 0.07f, 1.0f };
context->OMSetRenderTargets(1, renderTargetView.GetAddressOf(), depthView.Get());
context->RSSetViewports(1, &viewport);
context->ClearRenderTargetView(renderTargetView.Get(), clearColor);
context->ClearDepthStencilView(depthView.Get(), D3D11_CLEAR_DEPTH, 1.0f, 0);
context->DrawIndexed(indexCount, 0, 0);
ThrowIfFailed(swapChain->Present(1, 0));Flip-model swap chain에서는 성공한 Present 뒤 back buffer 0이 pipeline에서 unbind될 수 있으므로 다음 frame에 RTV를 다시 bind합니다. Output binding을 추적하는 state cache도 이 경계에서 무효화합니다.
수명 경계
Device와 장기 resource는 초기화·scene 수명에 맞춰 재사용하고 frame마다 변하는 값만 갱신합니다. Resize와 device removal은 size-dependent 또는 device-dependent resource를 다시 만드는 별도 수명 경계입니다. 화면이 비는 문제는 검은 화면과 Binding 오류 진단의 output-to-input 순서로 확인합니다.
자주 틀리는 점
- Resource를 만들었다고 pipeline에 자동 연결되지는 않습니다.
- Context state는 이전 draw에서 남으므로 draw마다 필요한 contract를 명시적으로 관리합니다.
Present는 scene을 계산하는 함수가 아니라 준비된 back buffer를 표시하는 경계입니다.- GPU 실행은 CPU 호출과 비동기일 수 있으므로 draw 직후 resource를 함부로 덮어쓰지 않습니다.
참고 링크
2 sources