Семантика 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 | OpenGL | Direct3D | Описание |
---|---|---|---|
INIT_ATTRIBUTE(TYPE,NUM,SEMANTICS) | in TYPE s_attribute_ ## NUM; | TYPE attribute_ ## NUM : SEMANTICS; | Adds a semantic to a vertex shader variable. Добавляет семантику к переменной вершинного шейдера. |
INIT_OUT(TYPE,NUM) | out TYPE s_texcoord_ ## 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 | OpenGL | Direct3D | Описание |
---|---|---|---|
IN_INSTANCE | gl_InstanceID | input.instance | An input per-instance identifier system-value variable. Входная переменная системного значения идентификатора экземпляра. |
IN_ATTRIBUTE(NUM) | s_attribute_ ## NUM | input.attribute_ ## NUM | An input shader variable. Входная переменная шейдера. |
OUT_DATA(NUM) | s_texcoord_ ## NUM | output.data_ ## NUM | An output texture coordinates variable. Выходная переменная координат текстуры. |
OUT_POSITION | gl_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 | OpenGL | Direct3D | Описание |
---|---|---|---|
INIT_IN(TYPE,NUM) | in TYPE s_texcoord_ ## NUM; | TYPE data_ ## NUM : TEXCOORD ## NUM; | Adds an input texture coordinates semantic. Добавляет семантику координат входной текстуры. |
INIT_COLOR(TYPE) | out TYPE s_frag_color; | 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) | out TYPE s_frag_data_ ## 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 | OpenGL | Direct3D | Описание |
---|---|---|---|
IN_POSITION | gl_FragCoord | input.position | An input position value. Входное значение позиции. |
IN_DATA(NUM) | s_texcoord_ ## NUM | input.data_ ## NUM | An input texture coordinates variable. Входная переменная координат текстуры. |
IN_FRONTFACE | !gl_FrontFacing | 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 | s_frag_color | output.color | An output color value (single RT). Выходное значение цвета (одиночное RT). |
OUT_DEPTH | gl_FragDepth | output.depth | An output depth value. Значение глубины вывода. |
OUT_MRT(NUM) | out TYPE s_frag_data_ ## 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 | OpenGL | Direct3D | Описание |
---|---|---|---|
INIT_GEOM_IN(TYPE,NUM) | in TYPE s_geom_texcoord_ ## NUM[]; | TYPE data_ ## NUM : TEXCOORD ## NUM; | Add an input texture coordinates semantic for the geometry-shader stage. Добавить семантику входных координат текстуры для этапа геометрического шейдера. |
INIT_GEOM_OUT(TYPE,NUM) | out TYPE s_geom_texcoord_ ## NUM; | TYPE data_ ## NUM : TEXCOORD ## NUM; | Add an output texture coordinates semantic for the geometry-shader stage. Добавить семантику координат выходной текстуры для этапа геометрического шейдера. |
UUSL | OpenGL | Direct3D | Описание |
---|---|---|---|
IN_GEOM_DATA(NUM,INDEX) | s_geom_texcoord_ ## NUM ## [INDEX] | input[INDEX].data_ ## NUM | An input texture coordinates value. Входное значение координат текстуры. |
IN_GEOM_POSITION(INDEX) | gl_in[INDEX].gl_Position | input[INDEX].position | An input position value. Входное значение позиции. |
OUT_GEOM_DATA(NUM) | s_geom_texcoord_ ## NUM | output.data_ ## NUM | An output texture coordinates value. Выходное значение координат текстуры. |
TRIANGLE_IN | triangles | triangle | Input primitive type: triangle list or triangle strip. Тип входного примитива: список треугольников или полоса треугольников. |
TRIANGLE_OUT | triangle_strip | TriangleStream | Output primitive type: a sequence of triangle primitives Тип выходного примитива: последовательность примитивов треугольника |
LINE_IN | lines | line | Input primitive type: line. Тип входного примитива: строка. |
LINE_OUT | line_strip | 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