FrankieTheSkin Ответов: 0

Direct3d 10 создание цепочки устройств и свопов


Ладно, я схожу с ума здесь, кажется, нет абсолютно ничего плохого, но D3D10CreateDeviceAndSwapChain() продолжает терпеть неудачу из-за "недопустимых" параметров (0x887A0001), хотя я искал в интернете, и все, что я нахожу, кажется, подтверждает, что мой код просто прекрасен. Кто-нибудь, пожалуйста, скажите мне, в чем проблема этой функции.

bool CreateGraphicsObjects(void)
{
	DXGI_SWAP_CHAIN_DESC scd				= {0};

	scd.BufferDesc.Width					= AppData.Width;
	scd.BufferDesc.Height					= AppData.Height;
	scd.BufferCount							= 1;
	scd.BufferDesc.Format					= DXGI_FORMAT_R8G8B8A8_UNORM;
	scd.BufferDesc.ScanlineOrdering			= DXGI_MODE_SCANLINE_ORDER_PROGRESSIVE;
	scd.BufferDesc.Scaling					= DXGI_MODE_SCALING_UNSPECIFIED;
	scd.BufferDesc.RefreshRate.Denominator	= 50;
	scd.BufferDesc.RefreshRate.Numerator	= 1;
	scd.SampleDesc.Count					= 1;
	scd.SampleDesc.Quality					= 0;
	scd.SwapEffect							= DXGI_SWAP_EFFECT_DISCARD;
	scd.BufferUsage							= DXGI_USAGE_RENDER_TARGET_OUTPUT;
	scd.OutputWindow						= AppData.MainWnd;
	scd.Windowed							= FALSE;

	D2D1_RENDER_TARGET_PROPERTIES rtp;

	rtp.pixelFormat.format					= DXGI_FORMAT_R8G8B8A8_UNORM;
	rtp.type								= D2D1_RENDER_TARGET_TYPE_DEFAULT;
	rtp.pixelFormat.alphaMode				= D2D1_ALPHA_MODE_PREMULTIPLIED;
	rtp.usage								= D2D1_RENDER_TARGET_USAGE_NONE;
	rtp.minLevel							= D2D1_FEATURE_LEVEL_DEFAULT;
	rtp.dpiX								= 0;
	rtp.dpiY								= 0;

	if ((Error = D3D10CreateDeviceAndSwapChain(NULL, D3D10_DRIVER_TYPE_HARDWARE, NULL, D3D10_CREATE_DEVICE_SINGLETHREADED, D3D10_SDK_VERSION, &scd, &SwapChain, &Gfx)) != S_OK)
	{
		RetCode = -1;
	}
	else if (SwapChain->GetBuffer(0, __uuidof(ID3D10Texture2D), (void**)&BkgBuff) != S_OK)
	{
		RetCode = -2;
	}
	else if (BkgBuff->QueryInterface(__uuidof(IDXGISurface), (void**)&BkgSurf) != S_OK)
	{
		RetCode = -3;
	}
	else if (D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &D2D) != S_OK)
	{
		RetCode = -4;
	}
	else if (D2D->CreateDxgiSurfaceRenderTarget(BkgSurf, &rtp, &Rtg) != S_OK)
	{
		RetCode = -5;
	}
	else if (DWriteCreateFactory(DWRITE_FACTORY_TYPE_ISOLATED, __uuidof(IDWriteFactory), (IUnknown**)&DWrite) != S_OK)
	{
		RetCode = -6;
	}
	else
	{
		RetCode = 0;
	}

	if (RetCode != 0)
	{
		return false;
	}

	return true;
}


Что я уже пробовал:

Я перепробовал буквально все, читал документацию MSDN, искал учебники, менял параметры и т. д., Но это просто не хочет работать.

Jochen Arndt

Проверьте правильность параметров среды выполнения (ширина, высота и дескриптор главного окна AppData).

Вы можете использовать D3D10_CREATE_DEVICE_DEBUG, чтобы получить более подробное сообщение о том, какие параметры неверны (требуется установленная поддержка отладки D3D).

Если все еще не решено, используйте документацию, чтобы проверить, есть ли конфликт с используемыми параметрами и поддерживаются ли запрошенные операции вашим оборудованием.

0 Ответов