Поделиться через


Общие сведения о ресурсе в Direct3D 11

Ресурсы — это стандартные блоки сцены. Они содержат большую часть данных, которые Direct3D использует для интерпретации и отрисовки сцены. Ресурсы — это области в памяти, к которым можно получить доступ с помощью конвейера Direct3D. Ресурсы содержат данные следующих типов: геометрия, текстуры, данные шейдеров. В этом разделе рассматриваются ресурсы Direct3D, такие как буферы и текстуры.

Вы можете создавать строго типизированные или бестипные ресурсы; вы можете контролировать, имеют ли ресурсы доступ как на чтение, так и на запись; вы можете сделать ресурсы доступными только для ЦП, GPU или и того, и другого. На каждом этапе конвейера может быть активно до 128 ресурсов.

Direct3D гарантирует возврат нуля для любого ресурса, доступ к которому осуществляется вне пределов.

Жизненный цикл ресурса Direct3D:

  • Создайте ресурс с помощью одного из методов create интерфейса ID3D11Device .
  • Привяжите ресурс к конвейеру с помощью контекста и одного из методов set интерфейса ID3D11DeviceContext .
  • Отмените выделение ресурса, вызвав метод Release интерфейса ресурса.

В этом разделе рассматриваются следующие вопросы.

Строгая и слабая типизация

Указать макет ресурса (тип размещения в памяти) можно двумя способами.

  • Typed — полностью укажите тип при создании ресурса.
  • Безтипный — полностью укажите тип, когда ресурс привязан к конвейеру.

При создании полностью типизированного ресурса он может использовать только тот формат, с которым был создан. Это позволяет среде выполнения оптимизировать доступ, особенно если ресурс создается с флагами, указывающими, что приложение не может его сопоставить. Ресурсы, созданные с определенным типом, нельзя переосмыслить с помощью механизма представления, если только ресурс не был создан с флагом D3D10_DDI_BIND_PRESENT. Если задано D3D10_DDI_BIND_PRESENT, то представления ресурсов render-target или шейдера можно создать для этих ресурсов с помощью любого из полностью типизированных членов соответствующего семейства, даже если исходный ресурс был создан как полностью типизированный.

В ресурсе меньшего типа тип данных неизвестен при первом создании ресурса. Приложение должно выбрать один из доступных типов меньше форматов (см . DXGI_FORMAT). Вам следует указать размер выделяемой области памяти и то, потребуется ли среде выполнения создать подтекстуры в MIP-карте. Однако точный формат данных (будет ли память интерпретироваться как целые числа, значения с плавающей запятой, целые числа без знака и т. д.) не определяется, пока ресурс не будет привязан к конвейеру с помощью представления ресурсов. Так как формат текстуры остается произвольным до привязки текстуры к конвейеру, ресурс называется хранилищем с нестрогой типизацией. Слабо типизированное хранилище имеет преимущество в том, что его можно повторно использовать или переосмыслить в другом формате, если количество компонентов и число бит каждого компонента одинаковы в обоих форматах.

Один ресурс можно привязать к нескольким этапам конвейера, если у каждой из них есть уникального представление, которое полностью квалифицирует форматы в каждом расположении. Например, ресурс, созданный в формате DXGI_FORMAT_R32G32B32A32_TYPELESS, можно одновременно использовать в качестве DXGI_FORMAT_R32G32B32A32_FLOAT и DXGI_FORMAT_R32G32B32A32_UINT в разных местах конвейера.

Представления ресурсов

Ресурсы можно хранить в памяти общего назначения, чтобы их можно было совместно использовать для нескольких этапов конвейера. Этап конвейера интерпретирует данные ресурсов с помощью представления. Представление ресурсов концептуально похоже на приведение данных ресурса, чтобы их можно было использовать в определенном контексте.

Представление можно использовать с бестипным ресурсом. То есть можно создать ресурс во время компиляции и объявить тип данных, когда ресурс привязан к конвейеру. Представление, созданное для бестипного ресурса, всегда имеет одинаковое количество битов на компонент; способ интерпретации данных зависит от указанного формата. Указанный формат должен принадлежать к тому же семейству, что и бестипный формат, используемый при создании ресурса. Например, ресурс, созданный в формате R8G8B8A8_TYPELESS, не может рассматриваться как R32_FLOAT ресурс, даже если оба формата могут иметь одинаковый размер в памяти.

Представление также предоставляет другие возможности, такие как возможность чтения поверхностей глубины или трафарета в шейдере, создание динамической кубической карты за один проход и одновременная отрисовка нескольких срезов тома.

Интерфейс ресурсов Описание
ID3D11DepthStencilView Доступ к ресурсу текстуры во время тестирования трафарета глубины.
ID3D11RenderTargetView Доступ к ресурсу текстуры, который используется в качестве целевого объекта отрисовки.
ID3D11ShaderResourceView Доступ к ресурсу шейдера, например к буферу констант, буферу текстуры, текстуре или дискретизатору.
ID3D11UnorderedAccessView Доступ к неупорядоченным ресурсам с помощью пиксельного шейдера или вычислительного шейдера.

 

Необработанные представления буферов

Необработанный буфер, который также можно назвать буфером байтов, можно представить как контейнер битов, к которому требуется необработанный доступ, то есть буфер, к которому можно легко получить доступ через блоки из одного или четырех 32-разрядных значений бестипизового адреса. Вы указываете, что требуется необработанный доступ к буферу (или к необработанному представлению буфера) при вызове одного из следующих методов для создания представления буфера:

При работе с необработанными буферами можно использовать типы объектов HLSL ByteAddressBuffer и RWByteAddressBuffer .

Чтобы создать необработанное представление для буфера, необходимо сначала вызвать ID3D11Device::CreateBuffer с флагомD3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS , чтобы создать базовый ресурс буфера. Этот флаг указывается в элементе MiscFlagsструктуры D3D11_BUFFER_DESC , на которую указывает параметр pDescID3D11Device::CreateBuffer . Вы не можете объединить флаг D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS с D3D11_RESOURCE_MISC_BUFFER_STRUCTURED. Кроме того, если вы указываете D3D11_BIND_CONSTANT_BUFFER в BindFlagsD3D11_BUFFER_DESC, вы также не сможете указать D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS в Разном теге. Это не ограничение только для необработанных представлений, так как буферы констант уже имеют ограничение, которое их нельзя объединить с любым другим представлением.

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

Ресурсы

Новые типы ресурсов