나는 스위치를 관리하는 올바른 방법을 찾고있는 여러 사이트를 트롤링했습니다. DirectX 11 전체 화면에서 전환 -> 윈도우 문제
나는 내가 그것을 금했지만 내가 무승부 호출에 대해 버텍스 및 픽셀 쉐이더를 설정하고 이니까 기괴한 문제를 발견했습니다 생각했다.나는 고도를 입력하여 전체 화면으로 교체 할 수 있습니다 모든 것이 빈 창을 떠나거나 제대로 렌더링하지만 업데이트를 렌더링 계속 결코 하나와 다시 교환, 괜찮습니다. 그것은 즉
는 기본적으로 하나 개의 프레임을 렌더링 할 수 있습니다 및 입력이 등록되어 있지만 전체 화면으로 바꿀 때까지 화면에 표시되지 않습니다.
그것의 명확한 내가 사용 발견 나는 아마 swapchain 또는 devicecontext 뭔가를 누락 플러시() 그것은 내가 분명히 해결책이 아니다 실현 그러나 작동하도록 강제한다.
기능 조각을
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;
와 WM_SIZE 케이스에서 높이/폭 전달되는
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);
크기 조정 기능을 렌더링 D3D11_CREATE_DEVICE_DEBUG 및 오류/경고/누출 없음, 주석 또는 입력 환영.
는 호기심 나는 D3D10_CREATE_DEVICE_SINGLETHREADED 플래그뿐만 아니라 디버그 플래그와이 문제를 해결하는 것을 추가했다. 스와핑 할 때 다른 스레드가 활성화되어 있지 않은지 확인해야할까요? – wookey
알았어,이 카드는 엔비디아 버그 일 뿐이며 친구들은 다른 ati 카드로 테스트를했는데 문제는 발생하지 않았다. 두 개의 nvidia gtx 460에서 테스트되었으며 같은 문제가 발생했습니다. 나는 다른 nvidia 카드가 똑같이 행동한다고 의심합니다. 최신 DirectX SDK를 가지고 있다면 튜토리얼 7 예제를 사용하여이 이상한 문제를 직접 테스트 할 수 있습니다. alt-enter를 누르고 alt-enter 키를 누르면 windowed로 돌아가고 창은 비어 있거나 정적으로 바뀌며 업데이트되지 않습니다. 이 예제에서는 resizeBuffers를 사용하지 않는 것에 대해 경고하지만 내 코드에서는이를 사용하고 있습니다. (같은 효과) – wookey
nvidia 570 gtx에서 테스트 한 결과 문제가 나타 났으므로 NVIDIA 문제 일 가능성이 높습니다. – wookey