2014-01-12 7 views
0

, 내 텍스처가 심하게 화면에 표시되며,이 스크린 샷입니다 완벽하지만 나는 스왑 체인을 창으로 초기화 할 때만 이것이 일어나고있는 것으로 나타났습니다. 그렇지 않으면 전체 화면으로 초기화합니다. 스프라이트가 올바르게 표시됩니다. 런타임 중에 전체 화면에서 창으로 전환하더라도 여전히 올바르게 표시됩니다.이 이미지는 화면에 표시된 이미지입니다.DirectX11 스왑 체인 텍스처 렌더링 문제가 창에 표시됩니까? 이미지가 아닌 당신이 볼 수 있듯이</p> <p><img src="https://i.stack.imgur.com/Y4bkq.jpg" alt="Texture shown badly on swapchain initialized to windowed"></p> <p>: 나는 DirectX11 기반의 게임 프레임 워크를 프로그래밍하고있어하지만 난 문제가 받고 있어요

Texture shown correctly on swapchain initialized to full screen and then toggled to windowed

내 swapchain의 초기화가 :

RECT dimensions; 
GetClientRect(game->Window, &dimensions); 

unsigned int width = dimensions.right - dimensions.left; 
unsigned int height = dimensions.bottom - dimensions.top; 

D3D_DRIVER_TYPE driverTypes[] = 
{ 
    D3D_DRIVER_TYPE_HARDWARE, 
    D3D_DRIVER_TYPE_WARP, 
    D3D_DRIVER_TYPE_REFERENCE, 
    D3D_DRIVER_TYPE_SOFTWARE 
}; 

unsigned int totalDriverTypes = ARRAYSIZE(driverTypes); 

D3D_FEATURE_LEVEL featureLevels[] = 
{ 
    D3D_FEATURE_LEVEL_11_0, 
    D3D_FEATURE_LEVEL_10_1, 
    D3D_FEATURE_LEVEL_10_0 
}; 

unsigned int totalFeatureLevels = ARRAYSIZE(featureLevels); 

DXGI_SWAP_CHAIN_DESC swapChainDesc; 
ZeroMemory(&swapChainDesc, sizeof(swapChainDesc)); 
swapChainDesc.BufferCount = DXGI_SWAP_EFFECT_SEQUENTIAL; 
swapChainDesc.BufferDesc.Width = width; 
swapChainDesc.BufferDesc.Height = height; 
swapChainDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 
swapChainDesc.BufferDesc.RefreshRate.Numerator = 60; 
swapChainDesc.BufferDesc.RefreshRate.Denominator = 1; 
swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; 
swapChainDesc.OutputWindow = game->Window; 
swapChainDesc.Windowed = true; 
swapChainDesc.SampleDesc.Count = 1; 
swapChainDesc.SampleDesc.Quality = 0; 

unsigned int creationFlags = 0; 

#ifdef _DEBUG 
creationFlags |= D3D11_CREATE_DEVICE_DEBUG; 
#endif 

HRESULT result; 
unsigned int driver = 0; 

pin_ptr<IDXGISwapChain*> swapChainPointer; 
swapChainPointer = &swapChain_; 

pin_ptr<ID3D11Device*> d3dDevicePointer; 
d3dDevicePointer = &d3dDevice_; 

pin_ptr<D3D_FEATURE_LEVEL> featureLevelPointer; 
featureLevelPointer = &featureLevel_; 

pin_ptr<ID3D11DeviceContext*> d3dContextPointer; 
d3dContextPointer = &d3dContext_; 

for (driver = 0; driver < totalDriverTypes; ++driver) 
{ 
    result = D3D11CreateDeviceAndSwapChain(0, driverTypes[driver], 0, creationFlags, featureLevels, totalFeatureLevels, 
     D3D11_SDK_VERSION, &swapChainDesc, swapChainPointer, 
     d3dDevicePointer, featureLevelPointer, d3dContextPointer); 

    if (SUCCEEDED(result)) 
    { 
     driverType_ = driverTypes[driver]; 
     break; 
    } 
} 

그리고 이것은 전체 화면으로 전환 할 수있는 코드 : IsFullScreen가 containig 함수에 전달 부울입니다

swapChain_->SetFullscreenState(isFullScreen, NULL); 

합니다.

아무도 도와 줄 수 있습니까? 미리 감사드립니다!

편집 :

가 해결 :

내 윈도우 생성에 변경 WS_OVERLAPPED 매개 변수했습니다 : 당신이 SwapChain 당신 SetFullScreen를 호출 할 때

RECT rc = { 0, 0, WindowWidth, WindowHeight }; 
AdjustWindowRect(&rc, WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, FALSE); 

LPCTSTR title = Utilities::StringToLPCSTR(Title); 

HWND hwnd = CreateWindowA("BSGame", title, WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, windowHandler, NULL); 

+0

을 WS_OVERLAPPEDWINDOW 뷰를 해제합니다 WS_OVERLAPPED을 변경했습니다 해결하기 위해, 다시 전체 화면으로 설정할 때 뷰포트? – catflier

+0

아니요, 이것은 함수입니다. 인라인 void GraphicsDevice :: FullScreen (bool isFullScreen) { \t swapChain _-> SetFullscreenState (isFullScreen, NULL); } – ThomasSquall

답변

0

을 WS_OVERLAPPEDWINDOW하려면, 모드 변경 만 요청하면됩니다. 확인 : (텍스처 및 RenderTargetView 예)

출시하여 swapchain에 바인딩 연관된 자원 :

일반적으로 호출 후, 당신은 당신의 기본 폼에서 WM_SIZE 메시지가 나타납니다, 당신은 다음 할 필요가 SwapChain이 여전히 파이프 라인에 바인딩되어 있으면 문제가 발생하기 때문에 장치 컨텍스트에서 ClearState를 호출 할 수도 있습니다. 런타임은 파이프 라인에 바인딩되어 있으면 리소스를 파괴하지 않습니다.

ID3D11Texture2D* texture; 
mSwapChain->GetBuffer(0,__uuidof(ID3D11Texture2D),(void**)(&texture)); 
//Get Buffer does an AddRef on top so we release 
texture->Release(); 

을 그리고 새로운 RenderTargetView를 만들 플러스 (새 크기로 뷰포트를 업데이트 다시 질감을 조회 할 수 있습니다, 마지막으로

HRESULT result = mSwapChain->ResizeBuffers(0,0,0,DXGI_FORMAT_UNKNOWN,0); 

:

다음 당신은 같은 swapchain에 크기를 조정할 전화 텍스처에서 설명 얻기). 문제 내 경우

+0

나에게 말하고있는 것처럼 내 코드를 업데이트했지만 동일한 코드를 얻었습니다. 코드를 게시물에서 어떻게 보여줄 수 있습니까 ?? – ThomasSquall

+0

나는 당신이 반대로 이해할 수 있다고 생각합니다. 크기를 변경하기 전에 윈도우 모드에서 문제가 발생했습니다! – ThomasSquall

0

이 내 상황이었다, 창을 만드는 동안이었다

RECT rc = { 0, 0, WindowWidth, WindowHeight }; 
AdjustWindowRect(&rc, WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, FALSE); 

LPCTSTR title = Utilities::StringToLPCSTR(Title); 

HWND hwnd = CreateWindowA("BSGame", title, WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, NULL, NULL, windowHandler, NULL); 

내가, 당신이 교환의 크기를 조정합니까 체인