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


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

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

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

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

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

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

В этом разделе содержатся следующие разделы:

Сильная и слабая типизация

Существует два способа полностью указать макет ресурса (или объем памяти):

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

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

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

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

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

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

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

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

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

 

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

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

  • Чтобы создать представление ресурсов шейдера (SRV) в буфер, вызовите ID3D11Device::CreateShaderResourceView с флагом D3D11_BUFFEREX_SRV_FLAG_RAW. Этот флаг указывается в элементе флагов структуры D3D11_BUFFEREX_SRV. Вы устанавливаете D3D11_BUFFEREX_SRV в элементе BufferEx структуры D3D11_SHADER_RESOURCE_VIEW_DESC, на которую указывает параметр pDesc функции ID3D11Device::CreateShaderResourceView. Вы также задаете значение D3D11_SRV_DIMENSION_BUFFEREX в элементе ViewDimension элемента D3D11_SHADER_RESOURCE_VIEW_DESC, чтобы указать, что SRV является необработанным представлением.
  • Чтобы создать неупорядоченное представление доступа (UAV) в буфер, вызовите ID3D11Device::CreateUnorderedAccessView с флагом D3D11_BUFFER_UAV_FLAG_RAW. Этот флаг указывается в элементе Flags структуры D3D11_BUFFER_UAV. Вы устанавливаете D3D11_BUFFER_UAV в элемент буфера члена D3D11_UNORDERED_ACCESS_VIEW_DESC структуры, к которой параметр pDesc функции ID3D11Device::CreateUnorderedAccessView указывает. Вы также задаете значение D3D11_UAV_DIMENSION_BUFFER в элементе ViewDimension элемента D3D11_UNORDERED_ACCESS_VIEW_DESC, чтобы указать, что UAV является необработанным представлением.

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

Чтобы создать необработанное представление для буфера, необходимо сначала вызвать ID3D11Device::CreateBuffer с флагом D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS, чтобы создать базовый ресурс буфера. Этот флаг указывается в элементе MiscFlags структуры D3D11_BUFFER_DESC, к которой параметр ID3D11Device::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 в MiscFlags. Это не ограничение только необработанных представлений, так как буферы констант уже имеют ограничение, которое невозможно объединить с любым другим представлением.

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

Ресурсы

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