2014-01-12 26 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功能的布爾值。

任何人都可以幫助我嗎?提前致謝!

編輯:

解決:

我已經在我的窗口創建變化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

你調整你交換鏈,釋放意見,復位你打電話設置全屏時的視口? – catflier

+0

不,這是功能; inline void GraphicsDevice :: FullScreen(bool isFullScreen) { \t swapChain _-> SetFullscreenState(isFullScreen,NULL); } – ThomasSquall

回答

0

當你調用SetFullScreen你SwapChain,你只需要改變模式。

通常情況下,通話後,你應該從你的主要形式收到WM_SIZE消息,然後需要做到以下幾點:

釋放綁定到您的swapchain任何相關的資源(如:紋理和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,加上更新您的視口的新的大小(從紋理獲取描述)。

+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