Как создать texture2d с полным набором мипмапов с DirectX11(версия до DirectX11.1)

На самом деле, я получил эту проблему из этого вопроса, который я разместил ранее. Он работает под Windows 10 с DirectX12. Но мне не удалось создать Texture2D под Windows 7 с DirectX11. Я создал второй texture2d для генерации mipmaps, как это:

D3D11_TEXTURE2D_DESC textureDesc;
textureDesc.Width = nWidth;//Video width
textureDesc.Height = nHeight;//Video height
textureDesc.MipLevels = 0;//generate a full set of subtextures.
textureDesc.ArraySize = 1;
textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
textureDesc.SampleDesc.Count = 1;
textureDesc.Usage = D3D11_USAGE_DEFAULT;
textureDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET;
textureDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
textureDesc.MiscFlags = D3D11_RESOURCE_MISC_GENERATE_MIPS;
m_pD3dDevice->CreateTexture2D(&textureDesc, NULL, &m_pTexture);

Я только что получил "Недопустимые аргументы" под Windows7. Похоже, что только DirectX11.1 гарантирует такое использование в соответствии с расширенной поддержкой общих ресурсов Texture2D. Флажки привязки D3D11_BIND_SHADER_RESOURCE и D3D11_BIND_RENDER_TARGET не поддерживаются в Windows 7(версия DirectX должна быть directx11). И без этого метод ID3D11DeviceContext::GenerateMips не действует. Мое приложение должно поддерживать Windows 7, поэтому есть ли альтернативное решение?

1 ответ

Причина, по которой он не работает в Windows 7, но работает в Windows 10, заключается в том, что вы фактически используете дополнительную функцию Direct3D 11.2 Runtime: D3D11_FEATURE_DATA_D3D11_OPTIONS1.MapOnDefaultBuffers, У тебя есть D3D11_USAGE_DEFAULT а также D3D11_CPU_ACCESS_WRITE устанавливается одновременно, что не поддерживается без этой дополнительной функции и никогда не поддерживается в Windows 7. Существуют устройства даже в Windows 10, которые также не поддерживают эту функцию, поэтому вы не можете полагаться на то, что она работает на 100% времени.

Чтобы получить доступ к записи CPU, вам нужно использовать D311_USAGE_DYNAMIC, Это может повлиять на производительность использования этой текстуры для рендеринга, поэтому чаще вы будете использовать D3D11_USAGE_DEFAULT без доступа к записи процессора. Для инициализации таких текстур вы используете другую текстуру, которая установлена ​​на D3D11_USAGE_STAGING который всегда поддерживает доступ к записи процессора, а затем скопировать в DEFAULT ресурс, или вы можете использовать UpdateSubresource,

Для исходного кода C++ для выполнения всего этого, включая автоматическое отображение мипа, смотрите WICTextureLoader в наборе инструментов DirectX для DX11

Windows 7 с пакетом обновления 1 (SP1) можно обновить до среды выполнения DirectX 11.1 с помощью KB2670838, и на данный момент она довольно широко развернута. Существуют некоторые ограничения при работе в Windows 7, перечисленные в MSDN, в первую очередь из-за того, что она поддерживает только "программные" функции, а не "аппаратные" функции, для которых требуются драйверы WDDM 1.2. DirectX 11.2 Runtime или более поздняя версия не поддерживается для Windows 7.

Другие вопросы по тегам