семантика

Семантика — это строка, присоединенная к входным или выходным данным шейдера, который передает сведения о предполагаемом использовании параметра. Семантика необходима для всех переменных, передаваемых между этапами шейдера. Синтаксис для добавления семантики в переменную шейдера показан здесь (синтаксис переменной (DirectX HLSL)).

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

Семантика, поддерживаемая в Direct3D 9 и Direct3D 10 и более поздних версиях

В Direct3D 9 и Direct3D 10 и более поздних версиях поддерживаются следующие типы семантики.

Семантика шейдера вершин

Эти семантики имеют значение при присоединении к параметру вершинного шейдера. Эти семантики поддерживаются как в Direct3D 9, так и Direct3D 10 и более поздних версиях.

Входные данные Описание Тип
BINORMAL[n] Binormal float4
BLENDINDICES[n] Смешивание индексов uint
BLENDWEIGHT[n] Смешивание весов с плавающей запятой
COLOR[n] Диффузный и спектрулярный цвет float4
NORMAL[n] Обычный вектор float4
POSITION[n] Позиция вершины в пространстве объектов. float4
POSITIONT Преобразованная позиция вершины. float4
PSIZE[n] Размер точки с плавающей запятой
TANGENT[n] Касательной float4
TEXCOORD[n] Координаты текстуры float4
Выходные данные Описание Тип
COLOR[n] Диффузный или зримый цвет float4
ТУМАН Туман вершины с плавающей запятой
POSITION[n] Положение вершины в однородном пространстве. Положение вычислений в пространстве экрана путем деления (x,y,z) на w. Каждый шейдер вершин должен записывать параметр с этой семантикой. ПРИМЕЧАНИЕ. Эта семантика доступна в Direct3D 9. Для Direct3D 10 и более поздних версий используйте вместо этого SV_Position. float4
PSIZE Размер точки с плавающей запятой
TESSFACTOR[n] Фактор тесселяции с плавающей запятой

n — необязательное целое число от 0 до числа поддерживаемых ресурсов. Например, POSITION0, TEXCOORD1 и т. д.

Семантика шейдера пикселей

Эти семантики имеют значение при присоединении к входному параметру пиксельного шейдера. Эти семантики поддерживаются как в Direct3D 9, так и Direct3D 10 и более поздних версиях.

Входные данные Описание Тип
COLOR[n] Рассеянный или зримый цвет. float4
TEXCOORD[n] Координаты текстуры float4
VFACE Скаляр с плавающей запятой, указывающий на примитив с задней стороной. Отрицательное значение сталкивается назад, в то время как положительное значение сталкивается с камерой.

Примечание.
Эта семантика доступна в модели шейдера Direct3D 9 3.0. Для Direct3D 10 и более поздних версий используйте вместо этого SV_IsFrontFace .


с плавающей запятой
VPOS Расположение пикселей (x,y) в пространстве экрана. Чтобы преобразовать шейдер Direct3D 9 (который использует эту семантику) в шейдер Direct3D 10 и более поздних версий, см. статью Direct3D 9 VPOS и Direct3D 10 SV_Position) float2
Выходные данные Описание Тип
COLOR[n] Цвет вывода float4
DEPTH[n] Глубина вывода с плавающей запятой

n — необязательное целое число от 0 до числа поддерживаемых ресурсов. Например, PSIZE0, COLOR1 и т. д.

Семантика COLOR допустима только в режиме совместимости шейдера (т. е. при создании шейдера с помощью D3D10_SHADER_ENABLE_BACKWARDS_COMPATIBILITY).

Семантика поддерживается только для Direct3D 10 и более поздней версии.

Следующие типы семантики появились для Direct3D 10 и недоступны для Direct3D 9.

Семантика системного значения

Семантика системного значения является новой для Direct3D 10. Все системные значения начинаются с префикса SV_, типичным примером является SV_POSITION, который интерпретируется этапом растризатора. Системные значения допустимы в других частях конвейера. Например, SV_Position можно указать как входные данные в шейдер вершин, а также выходные данные. Шейдеры пикселей могут записывать только параметры с SV_Depth и SV_Target семантикой системного значения.

Другие системные значения (SV_VertexID, SV_InstanceID, SV_IsFrontFace) могут быть вводимы только в первый активный шейдер в конвейере, который может интерпретировать конкретное значение; После этого функция шейдера должна передать значения на последующие этапы.

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

Если тесселлирование включено, этап шейдера корпуса и этап шейдера домена присутствует. Для заданного исправления один и тот же PrimitiveID применяется к вызову шейдера корпуса исправления, и ко всем вызовам шейдера домена тесселлированного домена. Тот же PrimitiveID также распространяется на следующий активный этап; При включении этапа геометрии шейдера или шейдера пикселей.

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

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

Эти семантики добавлены в Direct3D 10; они недоступны в Direct3D 9.

Семантика системного значения для этапа растризатора.

Семантика системного значения Описание Тип
SV_ClipDistance[n] Данные расстояния клипа. SV_ClipDistance значения, как предполагается, являются расстоянием со знаком float32 к плоскости. Примитивная настройка вызывает только растрирование в пикселях, для которых интерполированные расстояния плоскости равны = >0. Несколько плоскостей клипов можно реализовать одновременно, объявляя несколько компонентов одного или нескольких элементов вершин в качестве SV_ClipDistance. Объединенные значения расстояния клипа и снимка находятся в большинстве компонентов D3D#_C пакет интерфейса пользователя_OR_CULL_DISTANCE_COUNT в большинстве регистров D3D#_C пакет интерфейса пользователя_OR_CULL_DISTANCE_ELEMENT_COUNT. Доступно для всех шейдеров для чтения или записи, кроме шейдера вершин, который может записывать значение, но не принимать его в качестве входных данных.
Атрибут клипов работает так, как SV_ClipDistance но работает на всех аппаратных уровнях компонентов 9_x и выше. Дополнительные сведения см. в разделе "Плоскости клипов пользователей" на аппаратном уровне 9 компонентов.
с плавающей запятой
SV_CullDistance[n] Данные расстояния cull. Когда компоненты элементов вершины получают эту метку, эти значения, как предполагается, являются плавающей запятой расстояние до плоскости. Примитивы будут полностью не карта если расстояния плоскости для всех вершин в примитиве имеют значение < 0. Несколько плоскостей сверток можно использовать одновременно, объявляя несколько компонентов одного или нескольких элементов вершин в качестве SV_CullDistance. Объединенные значения расстояния клипа и снимка находятся в большинстве компонентов D3D#_C пакет интерфейса пользователя_OR_CULL_DISTANCE_COUNT в большинстве регистров D3D#_C пакет интерфейса пользователя_OR_CULL_DISTANCE_ELEMENT_COUNT. Доступно для всех шейдеров для чтения или записи, кроме шейдера вершин, который может записывать значение, но не принимать его в качестве входных данных.
с плавающей запятой
SV_Coverage Маска, которая может быть указана для входных, выходных данных или обоих шейдеров пикселей.
Для SV_Coverage в шейдере пикселей выходные данные поддерживаются в ps_4_1 или более поздней версии.
Для SV_Coverage в шейдере пикселей входные данные требуют ps_5_0 или более поздней версии.
uint
SV_Depth Данные буфера глубины. Можно записать с помощью шейдера пикселей. с плавающей запятой
SV_DepthGreaterEqual В шейдере пикселей позволяет выводить глубину, если оно больше или равно значению, определенному растеризатором. Включает настройку глубины без отключения раннего Z. с плавающей запятой
SV_DepthLessEqual В шейдере пикселей позволяет выводить глубину, если значение меньше или равно значению, определенному растеризатором. Включает настройку глубины без отключения раннего Z. с плавающей запятой
SV_DispatchThreadID Определяет смещение глобального потока в вызове "Диспетчер" для каждого измерения группы. Доступно в качестве входных данных для шейдера вычислений. (только для чтения) uint3
SV_DomainLocation Определяет расположение в корпусе текущей точки домена. Доступно в качестве входных данных для шейдера домена. (только для чтения) float2|3
SV_GroupID Определяет смещение группы в вызове диспетчера для каждого измерения вызова диспетчера. Доступно в качестве входных данных для шейдера вычислений. (только для чтения) uint3
SV_GroupIndex Предоставляет плоский индекс для заданного потока в заданной группе. Доступно в качестве входных данных для шейдера вычислений. (только для чтения) uint
SV_GroupThreadID Определяет смещение потока в группе на измерение группы. Доступно в качестве входных данных для шейдера вычислений. (только для чтения) uint3
SV_GSInstanceID Определяет экземпляр шейдера геометрии. Доступно в качестве входных данных для шейдера геометрии. Экземпляр необходим, так как геометрическая шейдера может вызываться до 32 раз в одном и том же примитиве геометрии. uint
SV_InnerCoverage Представляет недооценную консервативную информацию о растризации (т. е. гарантируется ли полное покрытие пикселя). Можно прочитать или записать с помощью шейдера пикселей.
SV_InsideTessFactor Определяет объем тесселяции в поверхности исправления. Доступен в шейдере корпуса для записи и доступен в шейдере домена для чтения. float|float[2]
SV_InstanceID Идентификатор каждого экземпляра, автоматически созданный средой выполнения (см. сведения об использовании системных значений (Direct3D 10). Доступно для всех шейдеров.
SV_IsFrontFace Указывает, является ли треугольник передним. Для строк и точек IsFrontFace имеет значение true. Исключение — это линии, нарисованные из треугольников (режим проволочной рамки), который задает IsFrontFace таким же образом, как растрация треугольника в твердом режиме. Можно записать в геометрическую шейдеру и прочитать с помощью шейдера пикселей. bool
SV_OutputControlPointID Определяет индекс идентификатора контрольной точки, на который выполняется вызов основной точки входа шейдера корпуса. Можно читать только шейдером корпуса. uint
SV_Position Если SV_Position объявлен для ввода в шейдер, он может иметь один из двух указанных режимов интерполяции: linearNoPerspective или linearNoPerspectiveCentroid, где последний приводит к тому, что значения xyzw с centroid-snapped должны быть предоставлены при многосамплинной антилиассации. При использовании в шейдере SV_Position описывает расположение пикселей. Доступно во всех шейдерах для получения центра пикселей с смещением 0,5. float4
SV_PrimitiveID Автоматически созданный средой выполнения идентификатор для каждого примитива (см. сведения об использовании системных значений (Direct3D 10). Можно записать в геометрические или пиксельные шейдеры, а также считывать геометрические, пиксельные, шейдеры корпусов или предметных шейдеров. uint
SV_RenderTargetArrayIndex Индекс массива целевого объекта отрисовки. Применяется к выходным данным шейдера геометрии и указывает на срез целевого массива отрисовки, на который примитив будет нарисован шейдером пикселей. SV_RenderTargetArrayIndex допустимо, только если целевой объект отрисовки является ресурсом массива. Эта семантика применяется только к примитивам; Если примитив имеет несколько вершин, используется значение из начальной вершины. Это значение также указывает, какой срез массива представления глубины и набора элементов используется для чтения и записи.
Можно записать из шейдера геометрии и прочитать с помощью шейдера пикселей.
Если D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer , то trueSV_RenderTargetArrayIndex применяется к любому шейдеру, питающим растризатор.
uint
SV_SampleIndex Выборка данных индекса частоты. Доступно только для чтения или записи в шейдер пикселей. uint
SV_StencilRef Представляет текущее значение ссылочного набора элементов шейдера пикселей. Можно писать только шейдером пикселей. uint
SV_Target[n], где 0 <= n <= 7 Выходное значение, которое будет храниться в целевом объекте отрисовки. Индекс указывает, в каком из 8, возможно, привязанных целевых объектов отрисовки для записи. Значение доступно всем шейдерам. float[2|3|4]
SV_TessFactor Определяет объем тесселяции на каждом краю исправления. Доступно для написания в шейдере корпуса и чтения в шейдере домена. float[2|3|4]
SV_VertexID Идентификатор каждой вершины, автоматически созданный средой выполнения (см. раздел "Использование системных значений" (Direct3D 10)). Доступно только в качестве входных данных для шейдера вершин. uint
SV_ViewportArrayIndex Индекс массива viewport. Применяется к выходным данным шейдера геометрии и указывает, какой порт просмотра используется для примитива, который в настоящее время записывается. Можно считывать с помощью шейдера пикселей. Примитив преобразуется и обрезается против окна просмотра, указанного индексом перед передачей в растризатор. Эта семантика применяется только к примитивам; Если примитив имеет несколько вершин, используется значение из начальной вершины.
Если D3D11_FEATURE_DATA_D3D11_OPTIONS3::VPAndRTArrayIndexFromAnyShaderFeedingRasterizer , то trueSV_ViewportArrayIndex применяется к любому шейдеру, питающего растризатор.
uint
SV_ShadingRate Определяет, используя значения скорости заливки, количество пикселей, записанных одним вызовом шейдера пикселей для устройств уровня 2 или более поздней. Можно считывать из шейдера пикселей. Можно записать из вершины или геометрического шейдера. uint

Ограничения при написании SV_Depth:

  • При многосамплинге (MultisampleEnable имеет значение TRUE в D3D10_RASTERIZER_DESC) и написании значения глубины (с помощью шейдера пикселей), одно значение, записанное также используется в тесте глубины, поэтому возможность отрисовки примитивных краев при более высоком разрешении теряется при многосамплинге.
  • При использовании управления динамическим потоком невозможно определить, будет ли шейдер, который записывает SV_Depth в некоторых путях, гарантированно записывать SV_Depth в каждом выполнении. Сбой записи SV_Depth при объявлении результатов в неопределенном поведении (которое может или не включать дис карта пикселя).
  • Любое значение float32, включая +/-INF и NaN, можно записать в SV_Depth.
  • Запись SV_Depth по-прежнему действительна при выполнении двойного смешивания цветов источника.

Миграция с Direct3D 9 на Direct3D 10 и более поздних версий

При переносе кода из Direct3D 9 в Direct3D 10 и более поздних версий следует учитывать следующие проблемы:

Сопоставление с семантикой Direct3D 9

Некоторые из семантики Direct3D 10 и более поздних версий сопоставляются непосредственно с семантикой Direct3D 9.

Семантика Direct3D 10 Эквивалентная семантика Direct3D 9
SV_Depth DEPTH
SV_Position POSITION
SV_Target COLOR

[!] Примечание к разработчикам Direct3D 9: для целевых объектов Direct3D 9 семантика шейдера должна сопоставляться с допустимой семантикой Direct3D 9. Для обратной совместимости FXC обрабатывает POSITION0 (и его имена вариантов) как SV_Position. FXC обрабатывает COLOR как SV_TARGET. DXC и более новые компиляторы считают POSITION[n] и COLOR семантикой, определяемой пользователем.

Direct3D 9 VPOS и Direct3D 10 SV_Position

Семантическая SV_Position D3D10 предоставляет аналогичную функциональность семантике шейдера Direct3D 9 3 VPOS. Например, в Direct3D 9 для шейдера пикселей используется следующий синтаксис, используя координаты пространства экрана:

float4 psMainD3D9( float4 screenSpace : VPOS ) : COLOR
{
    // code here 
}

VPOS был добавлен для поддержки модели 3 шейдера, чтобы указать координаты пространства экрана, так как семантика POSITION была предназначена для координат пространства объектов.

В Direct3D 10 и более поздних версиях семантика SV_Position (при использовании в контексте шейдера пикселей) задает координаты пространства экрана (смещение на 0,5). Таким образом, шейдер Direct3D 9 будет примерно эквивалентен (без учета смещения 0,5) следующим образом:

float4 psMainD3D10( float4 screenSpace : SV_Position ) : COLOR
{
    // code here
}

При переходе с Direct3D 9 на Direct3D 10 и более поздних версий необходимо учитывать это при переводе шейдеров.

Пользовательские плоскости клипов в HLSL

Начиная с Windows 8, можно использовать атрибут функции клиппланов в объявлении функции HLSL, а не SV_ClipDistance, чтобы сделать шейдер работой на уровне компонентов 9_x, а также уровень компонентов 10 и выше. Дополнительные сведения см. в разделе "Плоскости клипов пользователей" на аппаратном уровне 9 компонентов.