Значения, сгенерированные системой, в Direct3D10 и Direct3D11 - SIISII/DirectX GitHub Wiki
Стадия сбора исходных данных, помимо извлечения данных из заданных программистом буферов, самостоятельно формирует так называемые значения, сгенерированные системой (system-generated values), основываясь на семантиках, заданных для входных параметров шейдеров. Все эти значения являются 32-разрядными двоичными целыми числами без знака.
Идентификатор вершины
Идентификатор вершины (VertexID) назначается каждой вершине индивидуально в процессе обработки примитивов стадией сбора исходных данных. Он доступен вершинному шейдеру при использовании семантики SV_VertexID
.
Порядок модификации идентификатора в процессе обработки в документации описан достаточно туманно. Вероятно, действуют следующие правила:
-
если рендеринг осуществляется с помощью одного из методов с индексацией (к ним относятся ID3D10Device::DrawIndexed и ID3D10Device::DrawIndexedInstanced либо ID3D11DeviceContext::DrawIndexed, ID3D11DeviceContext::DrawIndexedInstanced и, вероятно, ID3D11DeviceContext::DrawIndexedInstancedIndirect), значение идентификатора вершины совпадает со значением индекса, использованного для выборки этой вершины из вершинного буфера;
-
в случае рендеринга, запущенного методом без индексации, идентификаторы вершин будут последовательно возрастать (со свёрткой значения к нулю, если оно достигло максимума);
-
сам по себе вызов функции рендеринга увеличивает идентификатор на единицу (благодаря чему номер первой вершины, обрабатываемой следующим вызовом, будет на единицу больше номера последней вершины, обработанной предыдущим вызовом), а после выполнения рендеринга с индексацией идентификатор обнуляется.
Идентификатор экземпляра
Идентификатор экземпляра (InstanceID) доступен всем шейдерам при использовании семантики SV_InstanceID
. Он изначально равен нулю и, согласно документации, увеличивается на единицу при каждом вызове рендеринга, использующего индексацию. Остальные вызовы рендеринга это значение не изменяют.
Смысл этой величины ясен не до конца. Похоже, идентификатор экземпляра является номером логически единой группы примитивов. В частности при использовании полосы отрезков или прямоугольников, содержащей разрывы (т. е. если в индексном буфере встречаются значения –1, отделяющие одну непрерывную полосу примитивов от другой), каждая непрерывная полоса считается отдельным экземпляром и имеет идентификатор, на единицу превышающий идентификатор предыдущей полосы.
Идентификатор примитива
Идентификатор примитива (PrimitiveID) может быть доступен всем шейдерным стадиям, кроме вершинного шейдера, при использовании ими семантики SV_PrimitiveID
. При активной тесселяции идентификатор примитива поступает на вход каркасного и доменного шейдеров. Независимо от наличия тесселяции идентификатор примитива доступен геометрическому шейдеру, если он имеется, а затем — пиксельному шейдеру (но не обоим этим шейдерам одновременно). Геометрический шейдер может формировать произвольные значения идентификатора примитива для генерируемых им примитивов, затем эти значения будут передаваться пиксельному шейдеру.
Каждый вызов метода рендеринга с использованием индексации увеличивает идентификатор примитива на единицу, однако начало нового экземпляра обнуляет идентификатор примитива. Другие методы рендеринга не изменяют идентификатор примитива.
При использовании топологии со смежными вершинами генерация идентификаторов примитивов выполняется только для основных, а не примыкающих к ним примитивов.