Пользовательские шейдеры

Руководства о том, как писать свои собственные шейдеры в Wonderland Engine.

Вершинные vs Фрагментные шейдеры 

В Wonderland Engine на данный момент доступны API для написания пользовательских фрагментных шейдеров.

Структура материала 

Структура материала определяет свойства материала для ввода в ваш шейдер и создает пользовательский интерфейс.

Это определение структуры позволяет нам эффективно упаковывать входные данные материалов и автоматически генерировать распаковочный код в плейсхолдере {{ decoder }} вашего шейдера.

Пример структуры материала может выглядеть так:

1struct Material {
2    lowp vec4 ambientColor;
3    mediump uint diffuseTexture;
4    lowp uint shininess;
5    lowp float ambientFactor;
6    mediump float amplifier;
7};

Типы свойств 

Поддерживаются следующие типы свойств в сочетании с прецизионными спецификаторами lowp и mediump:

  • float, uint, int: Скалярные значения
  • vec2, vec3, vec4: Векторы с плавающей запятой
  • ivec2, ivec3, ivec4: Целочисленные векторы

Прецизия 

В Wonderland Engine lowp всегда будет приводить к 8-битному типу, закодированному для каждого компонента, mediump - к 16-битному типу (например, полуточная с плавающей запятой), а highp, где поддерживается, будет 32-битным типом.

Суффиксы 

Следующие суффиксы имеют специальное значение:

  • *Color: Будет генерировать инструмент выбора цвета. Используйте lowp для LDR цветов.
  • *Texture: Будет генерировать выпадающий список ресурсов текстур. Всегда используйте mediump.

Выравнивание памяти 

В связи с тем, как работает упаковка материала в Wonderland Engine, большинство типов векторов требуют выравнивания до 32-битов. Смотрите прецизия для того, как считать биты на компонент.

Символы препроцессора 

Чтобы скомпилировать части шейдера для повышения производительности, у нас есть расширенная реализация препроцессора.

Возможности 

Вы можете определить “Символы функций” в шейдерах для включения и отключения частей вашего шейдера:

1#define FEATURE_ALPHA_MASKED
2#define FEATURE_NORMAL_MAPPING
3#define FEATURE_VERTEX_COLORS
4#define FEATURE_WITH_EMISSIVE

FEATURE_<name> используется для определения функции с именем <name>. Они будут отображаться в настройках Views > Resources > Pipelines в списке “Features”. Если функция включена, символ будет определен с соответствующим именем функции, например, ALPHA_MASKED в приведенном выше примере (не FEATURE_ALPHA_MASKED).

Входы фрагментов 

Символы с префиксом USE_<input> используются для включения входов шейдера. У вас есть следующие варианты:

SymbolTypeName
USE_POSITION_WORLDhighp vec3fragPositionWorld
USE_POSITION_VIEWhighp vec3fragPositionView
USE_TEXTURE_COORDShighp vec2fragTextureCoords
USE_TEXTURE_COORDS_1highp vec2fragTextureCoords1
USE_COLORmediump vec4fragColor
USE_TANGENTmediump vec4fragTangent
USE_OBJECT_IDmediump uintfragObjectId
USE_MATERIAL_IDmediump uintfragMaterialId
USE_NORMALmediump vec3fragNormal
USE_BARYCENTRICmediump vec3fragBarycentric

Включения 

Wonderland Engine поставляется с системой включений шейдеров GLSL. Пожалуйста, обратитесь к существующим шейдерам для определения, какие включения обычно требуются.

Униформы 

Некоторые специальные униформы, которые всегда доступны:

UniformTypeDescription
viewIndexuintИндекс текущего вида, которое рендерится.

Для остальных, пожалуйста, используйте шейдеры, поставляемые с редактором, в качестве ссылки. Некоторые из них доступны только при включении через символ препроцессора.