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

В Direct3D 11 добавлено несколько новых типов ресурсов.

Буферы чтения и записи и текстуры

Ресурсы модели шейдера 4 доступны только для чтения. Модель шейдера 5 реализует новый соответствующий набор ресурсов для чтения и записи:

Для этих ресурсов требуется переменная ресурса для доступа к памяти (путем индексирования), так как нет методов прямого доступа к памяти. Переменную ресурса можно использовать в левой и правой части уравнения; Если используется справа, шаблон должен быть одним компонентом (float, int или uint).

Структурированный буфер

Структурированный буфер — это буфер, содержащий элементы одинакового размера. Используйте структуру с одним или несколькими типами элементов для определения элемента. Ниже приведена структура с тремя элементами.

struct MyStruct
{
    float4 Color;
    float4 Normal;
    bool isAwesome;
};

Используйте эту структуру для объявления структурированного буфера следующим образом:

StructuredBuffer<MyStruct> mySB;

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

float4 myColor = mySb[27].Color;

Используйте следующие типы объектов для доступа к структурированным буферам:

  • StructuredBuffer — это структурированный буфер только для чтения.
  • RWStructuredBuffer — это структурированный буфер для чтения и записи.

Атомарные функции , реализующие операции с блокировкой, разрешены для элементов int и uint в RWStructuredBuffer.

Буфер байтовых адресов

Буфер байтов — это буфер, содержимое которого может быть адресировано с помощью смещения байтов. Обычно содержимое буфера индексируется по каждому элементу с помощью шага для каждого элемента (S) и номера элемента (N), заданного S*N. Буфер байтового адреса, который также можно назвать необработанным буфером, использует смещение байтового значения от начала буфера для доступа к данным. Значение байта должно быть кратным четырем, чтобы оно было выровнено по DWORD. Если указано какое-либо другое значение, поведение не определено.

Модель шейдера 5 предоставляет объекты для доступа к буферу байтов только для чтения , а также к буферу байтового адреса для чтения и записи. Содержимое буфера байтовых адресов предназначено для 32-разрядного целого числа без знака; Если значение в буфере на самом деле не является целым числом без знака, используйте функцию , например asfloat , для его чтения.

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

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

Создайте неупорядоченный буфер доступа или текстуру, вызвав функцию , например ID3D11Device::CreateBuffer или ID3D11Device::CreateTexture2D , и передав флаг D3D11_BIND_UNORDERED_ACCESS из перечисления D3D11_BIND_FLAG .

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

Добавление и использование буфера

Буфер добавления и использования — это особый тип неупорядоченного ресурса, который поддерживает добавление и удаление значений из конца буфера аналогично тому, как работает стек.

Буфер добавления и использования должен быть структурированным буфером:

Используйте эти ресурсы с помощью их методов, эти ресурсы не используют переменные ресурсов.

Общие сведения о шейдере вычислений