Шейдеры
This type of node is used to describe a UUSL shader in an ULON-based material file. Currently, the engine supports Vertex, Control, Evaluate, Geometry, Fragment, and Compute shaders.Этот тип узла используется для описания шейдера UUSL в файле материала на основе ULON. В настоящее время движок поддерживает шейдеры Vertex, Control, Evaluate, Geometry, Fragment и Compute.
The syntax is the following:Синтаксис следующий:
Shader name =
#{
// UUSL code
#}
As a node's value you must specify a UUSL-based code enclosed in "#{" and "#}".В качестве значения узла необходимо указать UUSL-код, заключенный в "#{" и "#}".
See the SDK/data/core/materials/shaders/render/ directory for the list of headers implementing common shaders' functions which can be included and used in custom shaders. To start writing UUSL shaders, include the common header:См. в каталоге SDK/data/core/materials/shaders/render/ список заголовков, реализующих общие функции шейдеров, которые можно включать и использовать в пользовательских шейдерах. Чтобы начать писать шейдеры UUSL, включите общий заголовок:
#include <core/materials/shaders/render/common.h>
Types of ShadersТипы шейдеров#
The following types of shaders corresponding to their counterparts in different graphic APIs are available:Доступны следующие типы шейдеров, соответствующие их аналогам в различных графических API:
Unigine | DirectX | OpenGL |
---|---|---|
Vertex | Vertex | Vertex |
Control | Hull | Control |
Evaluate | Domain | Evaluate |
Geometry | Geometry | Geometry |
Fragment | Pixel | Fragment |
Compute | Compute | Compute |
Usage ExamplesПримеры использования#
The shader node is usually used as a shader value for the Pass node.Узел шейдера обычно используется как значение шейдера для узла Pass.
Shader shader_a =
#{
// some UUSL code
#}
Pass ambient
{
Vertex = shader_a
Fragment = shader_a
}
The advantages of this shader setup method are:Преимущества этого метода настройки шейдера:
- It reduces the amount of identical code.Это уменьшает количество одинакового кода.
- One shader code can be used in different render passes.Один код шейдера можно использовать в разных проходах рендеринга.
On the other hand, it is not the best approach for large shaders. Use includes for these cases:С другой стороны, это не лучший подход для больших шейдеров. Используйте includes для этих случаев:
- Write different shaders in separate files and then specify their paths as shader values in the pass:
// some UUSL code
// some UUSL code
Запишите разные шейдеры в отдельные файлы, а затем укажите их пути как значения шейдеров в проходе:Pass deferred { Vertex = "shaders/a.vert" Fragment = "shaders/b.frag" }
// some UUSL code
// some UUSL code
Pass deferred { Vertex = "shaders/a.vert" Fragment = "shaders/b.frag" }
- Include the code of a different shader by using the marker: #shader shader_name.
Включите код другого шейдера с помощью маркера: #shader shader_name.
Shader a = #{ // shader code A }# Shader b = #{ // shader code B #shader a }# // the result shader b will look like this: Shader b = #{ // shader code B // shader code A #}
Shader a = #{ // shader code A }# Shader b = #{ // shader code B #shader a }# // the result shader b will look like this: Shader b = #{ // shader code B // shader code A #}