Как создать текстуру 2d с полным набором MIP-карт с помощью DirectX11 (версия до DirectX11.1)

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

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, так что есть ли альтернативное решение?


person RustOnce    schedule 11.05.2018    source источник
comment
Первым шагом в отладке проблем с Direct3D является включение отладочного устройства. Вы получили какие-либо диагностические результаты от него? Кроме того, DirectX 11.1 поддерживается в Windows 7 при наличии KB2670838 установлен. MIP-карты Autogen отлично работают на DirectX 11.0 или более поздних версиях, поэтому проблема, вероятно, в чем-то другом...   -  person Chuck Walbourn    schedule 11.05.2018


Ответы (1)


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

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

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

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

person Chuck Walbourn    schedule 11.05.2018
comment
Я просто изменил D3D11_CPU_ACCESS_WRITE на 0, тогда все заработало. Странно, что D3D11_CPU_ACCESS_READ не в порядке. Большое спасибо! - person RustOnce; 14.05.2018
comment
Эта немного устаревшая статья на MSDN может помочь... - person Chuck Walbourn; 14.05.2018