Представления ресурсов в 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, хотя элементы обоих форматов занимают в памяти одинаковое место.

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

Имеются следующие представлений:

Расширенные версии интерфейсов представлений появились соответственно в 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). Наличие этого флага не накладывает ограничений на использование; в частности, для буфера можно создавать обычные типизированные представления и привязывать их к конвейеру.