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


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

В 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. Буфер адресов байтов, который также можно назвать необработанным буфером, использует смещение байтов с начала буфера для доступа к данным. Значение байта должно быть кратным из четырех, чтобы оно было выровнено. Если указано другое значение, поведение не определено.

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

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

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

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

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

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

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

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

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

Обзор шейдера вычислений