m_swapChain->ResizeBuffers(0, m_width, m_height, DXGI_FORMAT_UNKNOWN, 0);
윈도우 화면을 반응형으로 구현하기 backBuffer의 사이즈를 그에 맞게 바꾸기 위해 ResizeBuffers 함수를 이용하였다.
다만 해당 함수를 통해 RTV를 생성한 결과 처음 설정한 사이즈와 똑같은 사이즈를 출력함으로써 문제가 발생하였다. 해당 문제로 인해 DepthStencilView의 사이즈와 RenderTargetView의 사이즈가 달라서, 윈도우 창 크기 변경 시 화면이 정상적으로 출력되지 않는 오류가 발생하였던 것이다.
ID3D11Texture2D* backBuffer = nullptr;
ID3D11RenderTargetView* rtv = nullptr;
HR(m_swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D),
(void**)&backBuffer));
HR(m_device->CreateRenderTargetView(backBuffer, nullptr, &rtv));
SAFE_RELEASE(backBuffer);
해당 문제가 발생한 이유는 backBuffer를 해제를 시켜주지 않았기에 이전 데이터가 저장되어있어서 새로 할당한 데이터가 저장되지 않는 문제가 발생하였던 것이다.
그렇기 때문에, 간단하게 backBuffer->Release()를 추가해주면 문제가 손쉽게 해결할 수 있다.
backBuffer의 사이즈를 어떻게 확인하는가?
우리는 backBuffer를 Texture2D로 사용하여 rtv를 만든다. 이걸 이용해서 rtv의 리소스를 긁어와 width랑 height를 확인할 수 있다. GetResource -> GetDesc를 통해서 rtv 리소스의 desc를 긁어와서 확인하는 방식이다.
ID3D11Resource* rtvResource = nullptr;
rtv->GetResource(&rtvResource);
if (rtvResource != nullptr) {
ID3D11Texture2D* tex = reinterpret_cast<ID3D11Texture2D*>(rtvResource);
D3D11_TEXTURE2D_DESC desc{};
ZeroMemory(&desc, sizeof(desc));
tex->GetDesc(&desc);
m_width = buffer->m_width;
m_height = buffer->m_height;
'Graphics' 카테고리의 다른 글
bug : Shadow mapping 그림자 관련 (2) | 2024.07.24 |
---|---|
ECS에 대해서 - 1편 - (0) | 2024.07.18 |
bug : Shader stage did not run (0) | 2024.07.17 |
7. Screen Space Ambient Occlusion(SSAO) (0) | 2024.07.04 |
6. Deferred Lighting (0) | 2024.07.01 |