0

DirectX11 に基づいてゲーム フレームワークをプログラミングしていますが、問題が発生しています。テクスチャが画面に正しく表示されません。これはスクリーンショットです。

ウィンドウ表示に初期化されたスワップチェーンでテクスチャが正しく表示されない

ご覧のとおり、画像は完璧ではありませんが、これはスワップ チェーンをウィンドウ化するように初期化した場合にのみ発生することに気付きました。初期化せずに全画面表示に初期化した場合、スプライトは正しく表示されます。フルスクリーンからウィンドウ表示にスワップしても正しく表示されます。これは画面に表示される画像です。

全画面表示に初期化されてからウィンドウ表示に切り替えられたスワップチェーンでテクスチャが正しく表示される

私のスワップチェーンの初期化があります:

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 へ

4

2 に答える 2

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 に変更しました

于 2014-01-12T20:11:30.867 に答える