Ядро Common-Shader

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

diagram of data flow in a shader stage

  • Входные данные: шейдер вершин получает входные данные из этапа сборщика входных данных; геометрические и пиксельные шейдеры получают входные данные из предыдущего этапа шейдера. Дополнительные входные данные включают семантику системного значения, которая используется первым уроком в конвейере, к которому они применимы.
  • Выходные данные: шейдеры создают выходные результаты, передаваемые на последующий этап конвейера. Для геометрического шейдера объем выходных данных из одного вызова может отличаться. Некоторые выходные данные интерпретируются ядром общего шейдера (например, позицией вершин и индексом массива целевого объекта отрисовки), другие предназначены для интерпретации приложением.
  • Код шейдера: шейдеры могут считывать из памяти, выполнять векторные операции с плавающей запятой и целые арифметические операции или операции управления потоком. Количество инструкций, которые можно реализовать в шейдере, не ограничено.
  • Примеры: примеры определяют способ выборки и фильтрации текстур. До 16 примеров можно связать с шейдером одновременно.
  • Текстуры: текстуры можно фильтровать с помощью примеров или читать на основе каждого текселя непосредственно с внутренней функцией загрузки .
  • Буферы: буферы никогда не фильтруются, но можно считывать из памяти на основе каждого элемента непосредственно с внутренней функцией загрузки . Шейдер может быть привязан к шейдеру до 128 ресурсов текстуры и буфера (в сочетании).
  • Буферы констант: буферы констант оптимизированы для переменных константы шейдера. До 16 буферов констант можно привязать к этапу шейдера одновременно. Они предназначены для более частого обновления из ЦП; поэтому они имеют дополнительные ограничения размера, макета и доступа.

Различия между Direct3D 9 и Direct3D 10:

  • В Direct3D 9 каждый блок шейдера имел один, небольшой файл регистра констант для хранения всех переменных шейдера констант. Аккомодирование всех шейдеров с этим ограниченным пространством констант требует частой повторной переработки констант ЦП.
  • В Direct3D 10 константы хранятся в неизменяемых буферах в памяти и управляются как и любой другой ресурс. Количество буферов констант, которые может создать приложение, не ограничено. Организуя константы в буферы по частоте обновления и использования, объем пропускной способности, необходимой для обновления констант для размещения всех шейдеров, может значительно сократиться.

Поддержка целочисленных и битовых значений

Общее ядро шейдера предоставляет полный набор 32-разрядных целочисленных и битовых операций, совместимых с IEEE. Эти операции позволяют новому классу алгоритмов в примерах графического оборудования включать методы сжатия и упаковки, FFTs и управление потоком программ bitfield.

Типы данных int и uint в Direct3D 10 HLSL сопоставляются с 32-разрядными целыми числами в оборудовании.

Различия между Direct3D 9 и Direct3D 10:
В потоках Direct3D 9, помеченных как целое число в HLSL, интерпретировались как плавающая точка. В Direct3D 10 входные данные потока, помеченные как целое число, интерпретируются как 32-разрядное целое число.
Кроме того, логические значения теперь являются все биты набором или все биты не заданы. Данные, преобразованные в логическое значение, будут интерпретированы как true, если значение не равно 0,0f (положительное и отрицательное нулю разрешено иметь значение false) и false в противном случае.

битовые операторы;

Общее ядро шейдера поддерживает следующие побитовые операторы:

Оператор Function
~ Логическое НЕ
<< Клавиша SHIFT слева
>> Смена вправо
& Логическое «И»
| Логические или
^ Логический Xor
<<= Левая смена Равно
>>= Равный сдвиг вправо
&= И равно
|= Или равно
^= Xor Equal

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

Двоичные приведения

Приведение между целым числом и типом с плавающей запятой преобразует числовое значение после правил усечения C. Приведение значения из float, в int и обратно в плавающее значение — это преобразование потери, зависящее от точности целевого типа данных. Ниже приведены некоторые функции преобразования: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).

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

Модель шейдера 4