Как создать texture2d с полным набором мипмапов в DirectX11 (версия до DirectX11.1) - PullRequest
0 голосов
/ 11 мая 2018

На самом деле, я получил эту проблему из этого вопроса, который я отправил ранее. Он работает под Windows 10 с DirectX 12. Но мне не удалось создать Texture2D под Windows 7 с DirectX 11. Я создал второй 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 Ответ

0 голосов
/ 11 мая 2018

Причина, по которой он не работает в 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

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

...