我对后台缓冲区的像素格式概念了解不多。 但是,使用未知格式和指定格式之间的区别是什么:
(在DirectX 11中) DXGI_FORMAT_UNKNOWN VS DXGI_FORMAT_R8G8B8A8_UNORM
(在DirectX 9中) D3DFMT_UNKNOWN VS D3DFMT_X8R8G8B8
未知格式是否允许图形适配器选择最合适的格式?
谢谢!
修改
我在DirectX 9中尝试过未知格式并且可以正常工作:
D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory( &d3dpp, sizeof( d3dpp ) );
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.BackBufferCount = 1;
d3dpp.BackBufferHeight = 480;
d3dpp.BackBufferWidth = 640;
d3dpp.hDeviceWindow = mHWnd;
d3dpp.AutoDepthStencilFormat = D3DFMT_D16;
d3dpp.EnableAutoDepthStencil = TRUE;
我在DirectX 11中尝试过未知格式但它不起作用:
DXGI_SWAP_CHAIN_DESC sd;
sd.BufferDesc.Width = 640;
sd.BufferDesc.Height = 480;
sd.BufferDesc.RefreshRate.Numerator = 60;
sd.BufferDesc.RefreshRate.Denominator = 1;
sd.BufferDesc.Format = DXGI_FORMAT_UNKNOWN;
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
sd.OutputWindow = mhMainWnd;
sd.Windowed = true;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;
答案 0 :(得分:1)
您正在窗口模式下运行。来自DirectX9文档:
实际上,在窗口模式下,可以为BackBufferFormat指定D3DFMT_UNKNOWN。这告诉运行时使用当前的显示模式格式,并且无需调用GetDisplayMode。
所以,D3DFMT_UNKNOWN只是意味着“使用当前的显示设置”。 DirectX 11似乎不支持这一点,那里有关模式的文档(以及你应该如何创建交换链)有点复杂。我认为您可以在DirectX11中选择BackBufferFormat,无论实际的显示格式如何,转换都会自动发生。我想,现在可能有99%的显示器都设置为X8R8G8B8格式。