I have a problem with resizing swap chain buffer according to changed screen size.
When I make window smaller, size of rendered screen is less, than client area of that window.
Here is code for resizing buffer:
LRESULT CALLBACK System::WindowProc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam)
{
switch(umessage)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
case WM_CLOSE:
{
PostQuitMessage(0);
return 0;
}
case WM_SIZE:
{
int newWidth = LOWORD(lparam);
int newHeight = HIWORD(lparam);
if (wparam == SIZE_RESTORED)
{
system->application->d3d11->ResizeSwapChain(newWidth, newHeight);
//system->Save(newWidth, newHeight);
}
}
default:
{
return applicationHandle->MessageHandler(hwnd, umessage, wparam, lparam);
}
}
}
void D3D11::ResizeSwapChain(int width, int height)
{
if (swapChain)
{
RECT rc;
GetClientRect(hwnd, &rc);
ID3D11Texture2D* backBufferPtr;
//d3d11_DeviceContext->OMSetRenderTargets(0,0,0);
if (d3d11_DepthStencilBuffer)
{
d3d11_DepthStencilBuffer->Release();
d3d11_DepthStencilBuffer = NULL;
}
if (d3d11_RenderTargetView)
{
d3d11_RenderTargetView->Release();
d3d11_RenderTargetView = NULL;
}
swapChain->ResizeBuffers(1, 0, 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0);
swapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (LPVOID*)&backBufferPtr);
d3d11_Device->CreateRenderTargetView(backBufferPtr, NULL, &d3d11_RenderTargetView);
//??????????? ????????? ?? ?????? ?????, ??? ??? ?? ?????? ?? ?????
backBufferPtr->Release();
backBufferPtr = 0;
//d3d11_DeviceContext->OMSetRenderTargets(1, &d3d11_RenderTargetView, NULL);
D3D11_TEXTURE2D_DESC depthBufferDescription;
//?????????????? ???????? ????????? Depth_Buffer
ZeroMemory(&depthBufferDescription, sizeof(depthBufferDescription));
//????????? ???????? ?????????
depthBufferDescription.Width = width;
depthBufferDescription.Height = height;
depthBufferDescription.MipLevels = 1;
depthBufferDescription.ArraySize = 1;
depthBufferDescription.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
depthBufferDescription.SampleDesc.Count = 1;
depthBufferDescription.SampleDesc.Quality = 0;
depthBufferDescription.Usage = D3D11_USAGE_DEFAULT;
depthBufferDescription.BindFlags = D3D11_BIND_DEPTH_STENCIL;
depthBufferDescription.CPUAccessFlags = 0;
depthBufferDescription.MiscFlags = 0;
//??????? ???????? ??? ?????? ??????? ????????? ??????????? ?????????
d3d11_Device->CreateTexture2D(&depthBufferDescription, NULL, &d3d11_DepthStencilBuffer);
//??????????? render target view ? depth stencil buffer ? output pipeline
d3d11_DeviceContext->OMSetRenderTargets(1, &d3d11_RenderTargetView, d3d11_DepthStencilView);
D3D11_RASTERIZER_DESC rasterizerDescription;
//????????? ????????? Raster_Description, ??????? ????? ?????????? ??? ? ????? ???????? ????? ??????????
rasterizerDescription.AntialiasedLineEnable = false;
rasterizerDescription.CullMode = D3D11_CULL_BACK;
rasterizerDescription.DepthBias = 0;
rasterizerDescription.DepthBiasClamp = 0.0f;
rasterizerDescription.DepthClipEnable = true;
rasterizerDescription.FillMode = D3D11_FILL_SOLID;
rasterizerDescription.FrontCounterClockwise = false;
rasterizerDescription.MultisampleEnable = false;
rasterizerDescription.ScissorEnable = false;
rasterizerDescription.SlopeScaledDepthBias = 0.0f;
//??????? rasterizerState ?? ????????, ??????? ?????? ??? ?????????
d3d11_Device->CreateRasterizerState(&rasterizerDescription, &d3d11_RasterizerState);
//????????????? rasterizer state (????? ?????? ????????? ? D3D11_FILL_SOLID ?? D3D11_FILL_WIREFRAME)
d3d11_DeviceContext->RSSetState(d3d11_RasterizerState);
//????????????? ??????? ??? ??????????
D3D11_VIEWPORT viewPort;
viewPort.Width = (float)width;
viewPort.Height = (float)height;
viewPort.MinDepth = 0.0f;
viewPort.MaxDepth = 1.0f;
viewPort.TopLeftX = 0.0f;
viewPort.TopLeftY = 0.0f;
//??????? ViewPort
d3d11_DeviceContext->RSSetViewports(1,&viewPort);
}
}
I attached screenshots of described problem.