Я просматривал различные сайты в поисках правильного способа управления переключением.
Я думал, что взломал его, но теперь я заметил странную проблему, когда устанавливаю вершинные и пиксельные шейдеры для вызова отрисовки.
Я могу переключиться в полноэкранный режим с помощью alt-enter, и все в порядке, вернуться обратно, либо оставить пустое окно, либо отобразить правильно, но никогда не продолжать отображать какие-либо обновления.
То есть он в основном отображает один кадр, и любой ввод регистрируется, но не отображается на экране, пока вы не переключитесь на полноэкранный режим.
Ясно, что я, вероятно, что-то упустил с swapchain или devicecontext, поскольку я заметил, что использование Flush() заставит его работать, однако я понимаю, что это явно не решение.
Фрагмент функции рендеринга
cube_.setToContext(context);
context->VSSetConstantBuffers( 0, 1, &cb_NeverChanges_ );
context->VSSetConstantBuffers( 1, 1, &cb_ResizeChanges_ );
context->VSSetConstantBuffers( 2, 1, &cb_FrameChanges_ );
context->PSSetConstantBuffers( 0, 1, &cb_NeverChanges_ );
context->PSSetConstantBuffers( 1, 1, &cb_ResizeChanges_ );
context->PSSetConstantBuffers( 2, 1, &cb_FrameChanges_ );
context->VSSetShader( vertexShader_, nullptr, 0 );
context->PSSetShader( pixelShader_, nullptr, 0 );
context->Draw(cube_.getVertexTotal(), 0);
dx_.getSwapChain()->Present(0,0);
Функция изменения размера, которая получает переданную высоту/ширину из случая WM_SIZE
if(FAILED(swapChain_->GetFullscreenState(&fullScreen, nullptr)))
OutputDebugStringA("Failed to get fullscreen state.\n");
swapChain_->GetDesc(&swapChainDesc);
swapChainDesc.Windowed = !fullScreen;
swapChainDesc.Flags = 0;
if(fullScreen)
swapChainDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
//Release renderTarget, depth stencil, depth stencil view, etc
depthStencilView_->Release();
depthStencil_->Release();
renderTarget_->Release();
if(FAILED(swapChain_->ResizeBuffers(swapChainDesc.BufferCount,width,height, swapChainDesc.BufferDesc.Format ,swapChainDesc.Flags)))
{
MessageBox( NULL, "Failed to resize buffers.", "Error", MB_OK );
return false;
}
//recreate everything that was released
if(!createRenderTarget())
return false;
if(!createDepthStencils(width,height))
return false;
context_->OMSetRenderTargets( 1, &renderTarget_, depthStencilView_);
D3D11_VIEWPORT vp; //Should be a member of dx!
vp.Width = (float)width;
vp.Height = (float)height;
vp.MinDepth = 0.0f;
vp.MaxDepth = 1.0f;
vp.TopLeftX = 0;
vp.TopLeftY = 0;
context_->RSSetViewports( 1, &vp );
Настройка цепочки обмена с этим
DXGI_SWAP_CHAIN_DESC swapChainDesc;
ZeroMemory( &swapChainDesc, sizeof( swapChainDesc ) );
swapChainDesc.BufferCount = 1;
swapChainDesc.BufferDesc.Width = width;
swapChainDesc.BufferDesc.Height = height;
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
swapChainDesc.BufferDesc.RefreshRate.Numerator = 0; //auto =0, originally 60
swapChainDesc.BufferDesc.RefreshRate.Denominator = 0;
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
swapChainDesc.OutputWindow = hWnd;
swapChainDesc.SampleDesc.Count = 1;
swapChainDesc.SampleDesc.Quality = 0;
swapChainDesc.Windowed = TRUE;
Я тестировал это с помощью D3D11_CREATE_DEVICE_DEBUG, никаких ошибок/предупреждений/утечек, любые комментарии или ввод приветствуются.