Организация шейдеров
Некоторые функции, описанные в настоящем документе, более не поддерживаются, либо начнут поддерживаться в будущем.
Шейдеры - программы исполняемые на GPU. В контексте движка SkyXEngine это файлы с исходным кодом на языке HLSL.
Технические характеристики
Все шейдеры используют язык HLSL версии 4.0.
Входной точкой (функцией) является функция main, которая должна быть единственной.
Виды файлов
Компилируемый шейдер - шейдер который загружается движком и компилируется.
Вершинный шейдер - обрабатывает вершины, имеет входную точку, расширение .vs
.
Геометрический шейдер - обрабатывает примитивы, опциональный, после вершинного шейдера, имеет входную точку, расширение .gs
.
Пиксельный шейдер - обрабатывает пиксели, после вершинного шейдера, имеет входную точку, расширение .ps
.
Вычислительный шейдер - позволяет производить произвольные вычисления, не является частью конвейера отрисовки, имеет входную точку, расширение .cs
.
Подключаемый файл - файл с исходным кодом шейдеров, содержит общие данные (структуры, значения, константы, дефайны, функции и прочее) для нескольких шейдеров, не имеет входной точки, расширение .h
. Такие файлы могут подключаться в шейдеры.
Правила именования и расположения
Именование шейдеров подчиняется общим правилам именования.
Все шейдеры расположены по относительному пути /gamesource/shaders/
.
Все шейдеры должны располагаться только на одном уровне вложенности, то есть примерно так:
/gamesource/shaders/dirname/dirname_shader.ext
Именование шейдеров аналогично именованию текстур, то есть каждый компилируемый шейдер, должен иметь префикс папки, в которой он расположен, после чего следует символ подчеркивания _
и далее имя шейдера с расширением. Например:
- Каталог
mtrlgeom
:- Вершинный шейдер
mtrlgeom_base.vs
; - Пиксельный шейдер
mtrlgeom_base.ps
.
- Вершинный шейдер
Структура директории
Каждая директория относится к определенной области рендера/расчетов:
- aigrid - рендер ai сетки;
- lighting - расчеты освещения;
- mtrlgeom - рендер материалов для статической геометрии;
- mtrlgreen - рендер материалов для растительности;
- mtrlskin - рендер материалов для анимационных моделей;
- particles - рендер частиц;
- pp - основные постпроцессорные расчеты;
- ppe - постпроцессорные эффекты;
- ppgensm - постпроцессорные генераторы теней;
- pptm - расчет tone mapping;
- sky - рендер sky элементов;
- sm - генерация данных для теней;
- stdr - стандартный рендер для всех материальных сущностей рендера.
Также, есть директория cache, которая хранит информацию о кэше шейдеров. Данная директория не предназначена для использования пользователями.
Общие подключаемые файлы
Общие подключаемые файлы располагаются в корневой директории шейдеров.
Список общих подключаемых файлов:
- gdefines.h - общие данные (значения, константы, дефайны) для большинства шейдеров;
- struct.h - все используемые структуры для входных/выходных данных шейдеров;
- ps.h - обертки функций для пиксельного шейдера;
- mtrl.h - общее API для шейдеров материалов;
- green.h - API для обработки растительности;
- skin.h - API для обработки анимационных моделей;
- shadow.h - API для работы с тенями.
Кэширование
Для ускорения загрузки шейдеров движок поддерживает кэширование. При кэшировании движок сохраняет скомпилированный код шейдера и иную необходимую информацию. Это позволяет значительно быстрее осуществлять загрузку.
При первой загрузке шейдеров создается их кэш в директории /gamesource/shaders/cache/
в следующий раз при загрузке шейдеров, в случае если код шейдеров не был изменен - будет загружен кэш.
Если был создан кэш, но исходного кода шейдеров больше нет, то движок будет грузить только кэш.