2011-02-17 12 views
1

나는 스위치를 관리하는 올바른 방법을 찾고있는 여러 사이트를 트롤링했습니다. 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 및 오류/경고/누출 없음, 주석 또는 입력 환영.

+0

는 호기심 나는 D3D10_CREATE_DEVICE_SINGLETHREADED 플래그뿐만 아니라 디버그 플래그와이 문제를 해결하는 것을 추가했다. 스와핑 할 때 다른 스레드가 활성화되어 있지 않은지 확인해야할까요? – wookey

+0

알았어,이 카드는 엔비디아 버그 일 뿐이며 친구들은 다른 ati 카드로 테스트를했는데 문제는 발생하지 않았다. 두 개의 nvidia gtx 460에서 테스트되었으며 같은 문제가 발생했습니다. 나는 다른 nvidia 카드가 똑같이 행동한다고 ​​의심합니다. 최신 DirectX SDK를 가지고 있다면 튜토리얼 7 예제를 사용하여이 이상한 문제를 직접 테스트 할 수 있습니다. alt-enter를 누르고 alt-enter 키를 누르면 windowed로 돌아가고 창은 비어 있거나 정적으로 바뀌며 업데이트되지 않습니다. 이 예제에서는 resizeBuffers를 사용하지 않는 것에 대해 경고하지만 내 코드에서는이를 사용하고 있습니다. (같은 효과) – wookey

+0

nvidia 570 gtx에서 테스트 한 결과 문제가 나타 났으므로 NVIDIA 문제 일 가능성이 높습니다. – wookey

답변

1

최신 NVIDIA 드라이버이 발행 GTX460과 gtx570에 대한 (드라이버 275.33가)에 대한 테스트를 해결했다.

분명히이 문제에 대한 소프트웨어 설명과 답변이 있지만 그 작업이 지금 내가 원했던 것입니다.

앞으로이 문제를 읽고 다른 픽스를 비틀어 쓰는 사람은 알려 주시기 바랍니다.

1

D3D10에서 11으로 이식 한 후 내 앱에서 동일한 문제가 발생했습니다. 전체 화면 모드에서 창 모드로 전환 할 때 모두 비어 있습니다. 최신 GeForce 드라이브를 설치하면 코드를 변경하지 않고도 문제가 해결되었습니다.