Представления ресурсов в Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki
Представление ресурса (resource view) конкретизирует возможности использования этого ресурса, а в случае нетипизированного ресурса — ещё и задаёт точный его тип для данного случая использования этого ресурса. Например, ресурс, созданный с типом DXGI_FORMAT_R32G32B32A32_TYPELESS
, может с помощью соответствующего представления быть привязан к одной стадии как имеющий тип DXGI_FORMAT_R32G32B32A32_FLOAT
, а к другой — как DXGI_FORMAT_R32G32B32A32_UINT
.
Представление концептуально подобно операции приведения типов: оно определяет, как интерпретировать информацию, находящуюся в ресурсе. Однако различная интерпретация возможна лишь в рамках формата, заданного при создании ресурса; например, если ресурс создан как DXGI_FORMAT_R8G8B8A8_TYPELESS
, он не может быть представлен как DXGI_FORMAT_R32_FLOAT
, хотя элементы обоих форматов занимают в памяти одинаковое место.
Представления привязываются к различным стадиям графического конвейера и определяют, как именно ресурс будет интерпретироваться и использоваться данной стадией. Один и тот же ресурс с помощью разных представлений может быть одновременно привязан к нескольким стадиям.
Имеются следующие представлений:
-
глубины/шаблона (depth-stencil view, DSV) — интерфейс ID3D10DepthStencilView или ID3D11DepthStencilView, обеспечивающий доступ к текстуре в процессе проверки глубины/шаблона на стадии вывода и слияния;
-
цели рендеринга (render target view, RTV) — интерфейс ID3D10RenderTargetView, ID3D11RenderTargetView или ID3D11RenderTargetView1, обеспечивающий доступ к текстурному ресурсу, используемому в качестве цели рендеринга;
-
шейдерного ресурса (shader resource view, SRV) — интерфейс ID3D10ShaderResourceView, ID3D10ShaderResourceView1, ID3D11ShaderResourceView или ID3D11ShaderResourceView1, обеспечивающий доступ к шейдерному ресурсу, например, к буферу констант, текстурному буферу, текстуре или сэмплеру;
-
представление неупорядоченного доступа (unordered access view, UAV, только Direct3D11) — интерфейс ID3D11UnorderedAccessView или ID3D11UnorderedAccessView1, обеспечивающий доступ к неупорядоченному ресурсу из пиксельного или вычислительного шейдера.
Расширенные версии интерфейсов представлений появились соответственно в Direct3D10.1 и Direct3D11.3.
Сырое представление буфера
Сырое представление (raw view) буфера появилось в Direct3D11 и является разновидностью представления шейдерного ресурса или представления неупорядоченного доступа, обеспечивающей доступ к буферу (часто называемому в таких ситуациях сырым) как к набору битов, используя смещения от начала буфера. Документация называет такие буферы «побайтово адресуемыми» (byte address buffer), что может вводить в заблуждение: хотя смещение задаётся действительно в байтах, оно всегда должно быть кратно четырём, а реальный доступ выполняется 32-битовыми величинами (двойными словами в терминологии архитектуры IA-32).
Сырое представление создаётся обычными методами создания представления буфера (ID3D11Device::CreateShaderResourceView, ID3D11Device3::CreateShaderResourceView1, ID3D11Device::CreateUnorderedAccessView или ID3D11Device3::CreateUnorderedAccessView1) путём указания соответствующего флага (D3D11_BUFFEREX_SRV_FLAG_RAW
либо D3D11_BUFFER_UAV_FLAG_RAW
). Для работы с такими буферами в шейдерах используются объекты типа ByteAddressBuffer или RWByteAddressBuffer.
Чтобы для буфера можно было создавать сырые представления, нужно при создании этого буфера указывать флаг D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS
(он не может использоваться совместно с флагами D3D11_RESOURCE_MISC_BUFFER_STRUCTURED
и D3D11_BIND_CONSTANT_BUFFER
). Наличие этого флага не накладывает ограничений на использование; в частности, для буфера можно создавать обычные типизированные представления и привязывать их к конвейеру.