, 내 텍스처가 심하게 화면에 표시되며,이 스크린 샷입니다 완벽하지만 나는 스왑 체인을 창으로 초기화 할 때만 이것이 일어나고있는 것으로 나타났습니다. 그렇지 않으면 전체 화면으로 초기화합니다. 스프라이트가 올바르게 표시됩니다. 런타임 중에 전체 화면에서 창으로 전환하더라도 여전히 올바르게 표시됩니다.이 이미지는 화면에 표시된 이미지입니다.DirectX11 스왑 체인 텍스처 렌더링 문제가 창에 표시됩니까? 이미지가 아닌 당신이 볼 수 있듯이</p> <p><img src="https://i.stack.imgur.com/Y4bkq.jpg" alt="Texture shown badly on swapchain initialized to windowed"></p> <p>: 나는 DirectX11 기반의 게임 프레임 워크를 프로그래밍하고있어하지만 난 문제가 받고 있어요
내 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);
이
을 WS_OVERLAPPEDWINDOW 뷰를 해제합니다 WS_OVERLAPPED을 변경했습니다 해결하기 위해, 다시 전체 화면으로 설정할 때 뷰포트? – catflier
아니요, 이것은 함수입니다. 인라인 void GraphicsDevice :: FullScreen (bool isFullScreen) { \t swapChain _-> SetFullscreenState (isFullScreen, NULL); } – ThomasSquall