Семантика UUSL
Redefined UUSL semantics allows you to create unified input\output shader structures for both graphics APIs. Переопределенная семантика UUSL позволяет создавать унифицированные структуры шейдеров ввода / вывода для обоих графических API.
Vertex Shader SemanticsСемантика вершинных шейдеров#
Vertex shader semantics contain necessary input and output data for shader. You should initialize variables first and then use them. Семантика вершинного шейдера содержит необходимые входные и выходные данные для шейдера. Вы должны сначала инициализировать переменные, а затем использовать их.
UUSL | Direct3D | Описание |
---|---|---|
INIT_ATTRIBUTE(TYPE,NUM,SEMANTICS) | TYPE attribute_ ## NUM : SEMANTICS; | Adds a semantic to a vertex shader variable. Добавляет семантику к переменной вершинного шейдера. |
INIT_OUT(TYPE,NUM) | TYPE data_ ## NUM : TEXCOORD ## NUM; | Adds an output data semantic. Добавляет семантику выходных данных. |
INIT_POSITION | float4 position : SV_POSITION; | Adds a position system-value semantic. Добавляет семантику системного значения позиции. |
INIT_INSTANCE | uint instance : SV_INSTANCEID; | Adds a per-instance identifier system-value semantic. Добавляет семантику системного значения идентификатора экземпляра. |
Here is an example of vertex shader input and output structures: Вот пример структур ввода и вывода вершинного шейдера:
// Input vertex data
STRUCT(VERTEX_IN)
INIT_ATTRIBUTE(float4,0,POSITION) // Vertex position
INIT_ATTRIBUTE(float4,1,TEXCOORD0) // Vertex texcoord (uv)
INIT_ATTRIBUTE(float4,2,TEXCOORD1) // Vertex basis tangent
INIT_ATTRIBUTE(float4,3,TEXCOORD2) // Vertex color
END
// Our output vertex data
STRUCT(VERTEX_OUT)
INIT_POSITION // Out projected position
INIT_OUT(float4,0) // Texcoord (uv)
INIT_OUT(float3,1) // Vertex direction
END
Use the following pre-defined variables to use the input\output vertex shader semantics: Используйте следующие предварительно определенные переменные, чтобы использовать семантику вершинного шейдера ввода \ вывода:
UUSL | Direct3D | Описание |
---|---|---|
IN_INSTANCE | input.instance | An input per-instance identifier system-value variable. Входная переменная системного значения идентификатора экземпляра. |
IN_ATTRIBUTE(NUM) | input.attribute_ ## NUM | An input shader variable. Входная переменная шейдера. |
OUT_DATA(NUM) | output.data_ ## NUM | An output texture coordinates variable. Выходная переменная координат текстуры. |
OUT_POSITION | output.position | An output position system-value variable. Переменная системного значения выходной позиции. |
Fragment Shader SemanticsСемантика фрагментного шейдера#
Fragment shader semantics contain necessary input and output data for shader. You should initialize variables first and then use them. Семантика фрагментного шейдера содержит необходимые входные и выходные данные для шейдера. Вы должны сначала инициализировать переменные, а затем использовать их.
UUSL | Direct3D | Описание |
---|---|---|
INIT_IN(TYPE,NUM) | TYPE data_ ## NUM : TEXCOORD ## NUM; | Adds an input texture coordinates semantic. Добавляет семантику координат входной текстуры. |
INIT_COLOR(TYPE) | TYPE color : SV_TARGET; | Add an output diffuse or specular color semantic (single RT). Добавить семантику выходного диффузного или зеркального цвета (одиночный RT). |
INIT_DEPTH | float depth : SV_DEPTH; | Add an output depth system-value semantic. Добавить семантику системного значения глубины вывода. |
INIT_MRT(TYPE,NUM) | TYPE color_ ## NUM : SV_TARGET ## NUM; | Add an output color system-value semantic (some RTs). Добавить семантику системного значения цвета вывода (некоторые RT). |
INIT_FRONTFACE | bool frontface : SV_ISFRONTFACE; | Adds an input semantic indicates primitive face (frontface or not). Добавляет входную семантику, указывающую на примитивное лицо (лицевая сторона или нет). |
To use the variables in the code, use the following variables: Чтобы использовать переменные в коде, используйте следующие переменные:
UUSL | Direct3D | Описание |
---|---|---|
IN_POSITION | input.position | An input position value. Входное значение позиции. |
IN_DATA(NUM) | input.data_ ## NUM | An input texture coordinates variable. Входная переменная координат текстуры. |
IN_FRONTFACE | input.frontface | Floating-point scalar that indicates a back-facing primitive. A negative value faces backwards, while a positive value faces the camera. Скаляр с плавающей запятой, который указывает обратный примитив. Отрицательное значение обращено назад, а положительное значение обращено к камере. |
OUT_COLOR | output.color | An output color value (single RT). Выходное значение цвета (одиночное RT). |
OUT_DEPTH | output.depth | An output depth value. Значение глубины вывода. |
OUT_MRT(NUM) | output.color_ ## NUM | An output color value for MRTs. Значение цвета вывода для MRT. |
Here is a simple example of using the variable in the main function of the shader: Вот простой пример использования переменной в основной функции шейдера:
MAIN_FRAG_BEGIN(FRAGMENT_IN)
float4 texcoord = IN_DATA(0);
/* ... other code ... */
MAIN_FRAG_END
Geometry Shader SemanticsСемантика геометрических шейдеров#
UUSL | Direct3D | Описание |
---|---|---|
INIT_GEOM_IN(TYPE,NUM) | TYPE data_ ## NUM : TEXCOORD ## NUM; | Add an input texture coordinates semantic for the geometry-shader stage. Добавить семантику входных координат текстуры для этапа геометрического шейдера. |
INIT_GEOM_OUT(TYPE,NUM) | TYPE data_ ## NUM : TEXCOORD ## NUM; | Add an output texture coordinates semantic for the geometry-shader stage. Добавить семантику координат выходной текстуры для этапа геометрического шейдера. |
UUSL | Direct3D | Описание |
---|---|---|
IN_GEOM_DATA(NUM,INDEX) | input[INDEX].data_ ## NUM | An input texture coordinates value. Входное значение координат текстуры. |
IN_GEOM_POSITION(INDEX) | input[INDEX].position | An input position value. Входное значение позиции. |
OUT_GEOM_DATA(NUM) | output.data_ ## NUM | An output texture coordinates value. Выходное значение координат текстуры. |
TRIANGLE_IN | triangle | Input primitive type: triangle list or triangle strip. Тип входного примитива: список треугольников или полоса треугольников. |
TRIANGLE_OUT | TriangleStream | Output primitive type: a sequence of triangle primitives Тип выходного примитива: последовательность примитивов треугольника |
LINE_IN | line | Input primitive type: line. Тип входного примитива: строка. |
LINE_OUT | LineStream | Output primitive type: a sequence of line primitives Тип выходного примитива: последовательность строковых примитивов |
Unified Shader SemanticsЕдиная семантика шейдеров#
Unified shader semantics allows you to create single structure for both vertex and fragment shaders. It facilitates the work with vertex and fragment shaders input/output structure by using single structure for both shaders: this structure will be output for vertex shader and input for fragment shader respectively. Унифицированная семантика шейдеров позволяет создавать единую структуру как для вершинных, так и для фрагментных шейдеров. Это облегчает работу со структурой ввода / вывода вершинных и фрагментных шейдеров за счет использования единой структуры для обоих шейдеров: эта структура будет выводиться для вершинного шейдера и вводиться для фрагментного шейдера соответственно.
You can write vertex and fragment shader in a single file with .shader extension. In this case, in the material you should specify this .shader file for both shader stages. Вы можете записать вершинный и фрагментный шейдер в один файл с расширением .shader. В этом случае в материале следует указать этот файл .shader для обоих этапов шейдера.
BaseMaterial <texture_prefix=tex var_prefix=var>
{
// ...
Pass auxiliary if [auxiliary]
{
Vertex = "core/materials/base/objects/mesh/shaders/auxiliary/auxiliary.shader"
Fragment = "core/materials/base/objects/mesh/shaders/auxiliary/auxiliary.shader"
}
// ..
}
UUSL | VERTEX | FRAGMENT | Описание |
---|---|---|---|
INIT_DATA(TYPE,NUM,NAME) | INIT_OUT(TYPE,NUM) \ #define NAME GET_DATA(NUM) | INIT_IN(TYPE,NUM) \ #define NAME GET_DATA(NUM) | Data initialization. Инициализация данных. |
GET_DATA(V) | OUT_DATA(V) | IN_DATA(V) | Helper for getting/setting data by using data name. Помощник для получения / установки данных с использованием имени данных. |
IF statementКонструкция IF#
There is also the IF_DATA(NAME) statement to execute an operation if the data is not null. Существует также оператор IF_DATA (NAME) для выполнения операции, если данные не равны нулю.
UUSL | VERTEX | FRAGMENT | Описание |
---|---|---|---|
IF_DATA(NAME) | #ifdef NAME | #ifdef NAME | Opening IF conditional statement. Открытие условного оператора IF. |
ENDIF | #endif | #endif | Closing IF conditional statement. Закрытие условного оператора IF. |
Here is a code snippet of shader, where the shader's IF statement is used. Вот фрагмент кода шейдера, в котором используется оператор IF.
//input struct
STRUCT(FRAGMENT_IN)
/* ... */
#ifdef ALPHA_FADE && USE_ALPHA_FADE
INIT_DATA(float,1,DATA_ALPHA_FADE)
#endif
/* ... */
END
//main functions
MAIN_FRAG_BEGIN(FRAGMENT_IN)
/* ... */
IF_DATA(DATA_ALPHA_FADE)
//code to execute if the data is not null
alphaFadeDiscard(DATA_ALPHA_FADE,IN_POSITION.xy);
ENDIF
/* ... */
MAIN_FRAG_END
Interpolation ModifiersМодификаторы интерполяции#
UUSL | Direct3D | Описание |
---|---|---|
MODIFER_LINEAR | linear | Interpolate between shader inputs; linear is the default value if no interpolation modifier is specified.Интерполировать входные данные шейдера; linear - значение по умолчанию, если не указан модификатор интерполяции. |
MODIFER_CENTROID | centroid | Interpolate between samples that are somewhere within the covered area of the pixel (this may require extrapolating end points from a pixel center). Centroid sampling may improve antialiasing if a pixel is partially covered (even if the pixel center is not covered). The centroid modifier must be combined with either the linear or noperspective modifier.Интерполировать между выборками, которые находятся где-то в пределах покрываемой области пикселя (для этого может потребоваться экстраполяция конечных точек из центра пикселя). Выборка центроидов может улучшить сглаживание, если пиксель частично покрыт (даже если центр пикселя не покрыт). Модификатор центроида должен сочетаться с модификатором linear или noperspective. |
MODIFER_NOINTERPOLATION | nointerpolation | Do not interpolate.Не интерполировать. |
MODIFER_NOPERSPECTIVE | noperspective | Do not perform perspective-correction during interpolation. The noperspective modifier can be combined with the centroid modifier.Не выполнять коррекцию перспективы во время интерполяции. Модификатор noperspective можно комбинировать с модификатором центроида. |
MODIFER_SAMPLE | sample | Interpolate at sample location rather than at the pixel center. This causes the pixel shader to execute per-sample rather than per-pixel.Интерполировать в местоположении образца, а не в центре пикселя. Это заставляет пиксельный шейдер выполняться по выборке, а не по пикселям. |