2014-01-12 6 views
0

Я программирование основы игры, основанную на DirectX11, но я получаю проблемы, мои текстуры плохо отображается на экране, это скриншот:Проблемы с рендерингом текстур DirectX11 при окнировании?

Texture shown badly on swapchain initialized to windowed

Как вы можете видеть изображение не но я заметил, что это происходит только в том случае, если я инициализирую цепочку подкачки для окон, если я этого не сделаю, и я инициализирую ее в полноэкранном режиме, спрайт будет показан правильно, даже если во время работы я поменяю весь экран на оконный он по-прежнему отображается правильно, это изображение показано на экране:

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; 
    } 
} 

И это код для переключения на весь экран:

swapChain_->SetFullscreenState(isFullScreen, NULL); 

Где IsFullScreen булева передается функции containig.

Может ли кто-нибудь мне помочь? Заранее спасибо!

EDIT:

Решено:

Я изменение параметра WS_OVERLAPPED на моем создании окна:

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); 

Для WS_OVERLAPPEDWINDOW

+0

ли вы изменить размер вы поменять цепь, выпустите взгляды, сброс видовые экраны, когда вы вызываете set full screen? – catflier

+0

Нет, это функция; inline void GraphicsDevice :: FullScreen (bool isFullScreen) { \t swapChain _-> SetFullscreenState (isFullScreen, NULL); } – ThomasSquall

ответ

0

Когда вы звоните SetFullScreen на вас SwapChain, вы запрашиваете только изменение режима.

Обычно после вызова, вы должны получить сообщение WM_SIZE от вашей основной формы, то вам необходимо сделать следующее:

Выпуска любых связанными с ресурсами связаны с вашей swapchain (например: Texture и RenderTargetView) Убедитесь вы также вызываете ClearState в контексте устройства, так как если вы SwapChain все еще привязаны к конвейеру, у вас также будет проблема (среда выполнения не будет уничтожать ресурс, если он привязан к конвейеру).

рядом вы называете размером на swapchain, как:

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

Наконец, вы можете запросить текстуру снова:

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

И создать новую RenderTargetView, а также обновить видовой новый размер (get Описание из текстуры).

+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); 

Для решения я изменил WS_OVERLAPPED на WS_OVERLAPPEDWINDOW

Смежные вопросы