1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/nomat-lcc-render

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Репозиторий:lcc-render

lcc-render

Пользовательский модуль рендера для Cocos Creator, позволяющий более удобно и гибко создавать эффекты рендера.

Введение

Недавно на форуме Cocos Creator я заметил множество публикаций с эффектами шейдеров, и мне захотелось использовать эти эффекты. Однако, я обнаружил, что многие из этих шейдеров довольно сложно использовать в Creator. Они не учитывают специфику объединения текстур и оптимизации рендера в Cocos Creator, поэтому использование ограничено. Вот почему появился этот проект. Сначала я работал над cocos2d-x, а затем перешёл на Cocos Creator, так что некоторые части кода могут быть реализованы лучше.

Установка

Установка очень проста — достаточно поместить этот проект в директорию плагинов Cocos Creator. Подробнее см. Документация по плагинам Cocos Creator.

Использование

Если вы хотите использовать встроенные эффекты этого плагина, просто добавьте компонент эффекта на узел, как показано ниже: avatar

Вы можете добавить компонент эффекта, начинающийся со слова Effect*. Обычно после добавления вам потребуется переместить текстуру рендера в автоматически добавленный компонент lcc$render.ShaderSpriteFrame, как показано ниже:

avatarТеперь ваш эффект рендера должен отображаться корректно. Вы можете изменять параметры эффекта через свойства компонента Effect*. Если же вы хотите настроить свой уникальный эффект рендера, то рекомендуется ознакомиться с документацией ниже. Основные параметры эффекта можно установить в компоненте Effect*, например, вот компонент эффекта мозаики: avatar

  • Конечно, это всего лишь набор базовых эффектов, предоставленных для удобства использования. Благодарю всех участников форума Cocos за предоставление этих эффектов.

  • Перед тем как углубиться в дизайн этого фреймворка, рекомендуется иметь базовое понимание шейдеров.# Дизайн фреймворка Фреймворк не является отдельным компонентом отрисовки, а представляет собой контейнер для узлов, используемых в процессе отрисовки. Различные параметры отрисовки добавляются в систему отрисовки через компоненты. Основные типы компонентов отрисовки:

  • Компонент системы отрисовки RenderSystem Этот компонент наследует RenderComponent, и он отвечает за организацию и обновление процесса отрисовки. Например, это может включать обновление материалов, свойств, форм, вершин и других элементов.* Компонент шейдеров ShaderComponent Шейдерные компоненты представляют конкретные данные отрисовки или управления, такие как SpriteFrame, Color, Float, Vec2, Vec3, Vec4, Macro и другие. Эти компоненты связаны с данными, передаваемыми шейдерам.## 1. Какие данные передаются в шейдер?

Пожалуйста, обратите внимание, что в данном тексте нет необходимости вносить изменения в имена переменных, команды CLI, пути к файлам, URL-адреса и IP-адреса, поскольку они уже находятся в правильном виде.Фреймворк использует компоненты **шaders** для организации данных, которые должны быть переданы в шейдер. Например, если нам нужно отрисовать изображение, то компонент **ShaderSpriteFrame** должен быть добавлен в систему рендера; этот компонент будет отвечать за передачу данных изображения в шейдер. Однако, если мы хотим использовать **шейдер маски**, нам может потребоваться добавить ещё один компонент **ShaderSpriteFrame**, чтобы передать данные маски. Ну а если мы хотим дополнительно настроить цвет, нам следует добавить компонент **ShaderColor**. Размер передаваемых данных контролируется, и можно передавать только необходимые данные.

2. Как передаются данные в шейдер?

Обычно есть два способа передачи данных в шейдер:

  • Uniform — передача данных как констант. В Creator'е это можно сделать через получение материала рендера и установку значений свойств. Преимущества — простота; недостаток — затрудняет объединение рендера.
  • Attribute — передача данных вершин. В текущем Creator'e это возможно только при создании своего класса рендера. Преимущества — позволяет объединять рендер; недостаток — сложность реализации в Creator'e и большее потребление памяти.Особенно важно объединение рендера при необходимости отрисовки большого количества объектов. Поэтому фреймворк использует персонализированный метод передачи данных, позволяющий выбирать метод передачи каждого типа данных в компонентах шейдеров. Некоторые типы данных требуют использования конкретного метода передачи и не могут быть изменены. Можно сравнить с помощью примера:
  • Это результат передачи данных с использованием uniform: avatar
  • А это результат передачи данных с использованием attribute: avatarКак видно, количество вызовов рендера (Draw Call) значительно меньше при использовании attribute.

Возможно, некоторые люди заметят проблему на основе этих двух сравниваемых изображений. Время кадра (FrameTime) больше при использовании attribute. Основная причина заключается в том, что время замера слишком малое, а также колебание времени в Cocos имеет ту же точность. Пример был сделан для 10 изображений, но если увеличить количество до 50, то станет очевидно, что FrameTime при использовании attribute остаётся тем же, тогда как при использовании uniform он увеличивается примерно в 4 раза.

3. Как можно настроить передачу данных?

Благодаря возможности использования макросов в определении шейдеров Creator, мы можем выполнять следующее:

#if USE_TEXTURE
uniform sampler2D texture;
#endif

С помощью макросов мы можем динамически отсекать части кода шейдера. Например, если мы пишем следующий код в вершинном шейдере:

#if ATTR_COLOR
in vec4 a_color;
out vec4 color;
#elif UNIF_COLOR
uniform UNIF_COLOR {
    vec4 u_color;
};
out vec4 color;
#else
vec4 D_color = vec4(1,1,1,1);
out vec4 color;
#endif
```Если нам требуется использовать передачу цвета через вершины (где каждая вершина может иметь свой уникальный цвет), то мы можем определить `ATTR_COLOR` как `true`, а `UNIF_COLOR` как `false`. В этом случае данные будут передаваться через вершины. Если же нам требуется использовать константное значение, мы можем установить `ATTR_COLOR` как `false`, а `UNIF_COLOR` как `true`, после чего определяем константу. Конечно, есть ещё и значение по умолчанию, которое используется, когда оба значения установлены как `false`.При использовании данных мы также можем проверять условия с помощью макросов, как показано ниже:

```cpp
#if ATTR_COLOR || UNIF_COLOR
    // ... ... Эти действия выполняются при передаче данных в шейдер
#endif

Каким образом эти данные могут быть переданы в вершинном шейдере? Очень просто:

// Определение цвета
// Вышеупомянутый кодовый сегмент [1]

...

void main(){
	...
#if ATTR_COLOR
	color = a_color;    // Вершина цвет передана дальше
#elif UNIF_COLOR
	color = u_color;    // Константный цвет передан дальше
#else
	color = D_color;    // По умолчанию цвет передан дальше
#endif
	...
    // Здесь также можно использовать переменную color
    ...
}

Затем следует описание того, как используется фрагментный шейдер, что гораздо проще:

...
in vec4 color;
...

void main(){
    ...
    gl_FragColor = color; // Используется цвет color
    ...
}

Хаха, не кажется ли вам, что всё равно приходится писать много кода? Но мы используем макросы, чтобы упростить эти операции.

############## Вершинный шейдер
// Определение цвета
LCC_VERT_VALUE_DEFINE(COLOR, vec4, color, vec4(1.0,1.0,1.0,1.0))

...

void main(){
	...
// Передача цвета
LCC_VERT_VALUE_PASS(COLOR, color)
	...
    // Здесь также можно использовать color
}

############## Фрагментный шейдер

// Импорт цвета
LCC_FRAG_VALUE_IMPORT(vec4, color)

...```c
void main(){
	...
	gl_FragColor = color; // Здесь color может использоваться произвольным образом
	...
}
  • Поскольку пока еще не совсем понятно, как определяются include-файлы шейдеров в плагинах, то сейчас все определения включаются вручную. Конкретный путь до файла с определениями lcc-render/framework/src/render/build/lcc-defines.inc.

Переменные в компонентах шейдеров обычно определяются двумя способами, как показано ниже:

* `UNIFORM` константа
![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/QQ%E6%8D%A2%E5%9B%BEPNG20201021230131.png)
  
  `Unif Macro` указывает макрос, используемый для этой константы, `Name` — это имя макроса, а `Check Only` означает, что этот макрос используется только для проверки.
  * `Проверка используется тогда, когда макрос был определён как true ранее, и только тогда эта константа активируется и передаётся.` Это применимо к нескольким связям данных, например:
  	```cpp
	#if USE_TEXTURE
		in vec2 a_uv;
		out vec2 uv;
	#endif
	```
	Если `USE_TEXTURE` определено, то передаётся `a_uv`. Без текстур UV не имеет значения.

  `Unif Name` указывает имя константы в шейдере.

* `ATTRIBUTE` вершина данных
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/QQ%E6%8D%A2%E5%9B%BEPNG20201021230223.png)

  Для атрибута данных `Attr Macro` и `Name` имеют ту же значимость, что и вышеописанные константы. 
  `Особое внимание стоит обратить на то, что если данные передаются через вершины, каждую вершину можно присвоить уникальным данными, например установить разные цвета для четырёх углов изображения.`

# Описание компонентов шейдеров

## ShaderSpriteFrameЭтот компонент связан с изображением; если ваш эффект отрисовки требует использования изображений, вам следует добавить этот компонент. Количество изображений может быть любым.
![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/QQ%E6%88%AA%E5%9B%BE20201021232912.png)

* `Применить форму` — применяется ли текущий размер изображения, если выбрано значение "Да", то размер отрисовки будет таким, как указан ниже (`Если в системе отрисовки нет других компонентов, использующих форму, то форма будет взята из формы узла`).
* `Тип формы` — тип формы, можно использовать форму узла или задать свою.
* `Trim` и `Sprite` — совместно используются для реализации режима Simple в компоненте Sprite.
* `Применить UV` — применение UV изображения в шейдер.
* `Пользовательское UV` — возможность задать порядок вершин UV.
* `Применить UVRect` — применение прямоугольника UV из спрайта в шейдер (`Не обязательно выключать спрайты, но возможно потребуется рассчитывать реальные UV относительно UV изображения, макросы предоставляют функции`).
* `Применить размер кадра` — передача пиксельного размера изображения в шейдер, некоторые эффекты, такие как гауссовое размытие, могут это использовать.## ShaderColor

Этот компонент связан с цветами; если ваш эффект отрисовки требует передачи цветов, вам следует добавить этот компонент.
![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/QQ%E6%88%AA%E5%9B%BE20201021233033.png)</br>
* `Применить цвет узла` — прямое применение цвета узла.
* `Тип цвета` — можно задать однородный цвет или цвет для каждой вершины.
* `Цвет вершин` — цвет каждой вершины, последовательность: нижний левый, нижний правый, верхний левый, верхний правый. Цвета можно менять во время работы.

## ShaderFloat/ShaderVec2/ShaderVec3/ShaderVec4
Эти компоненты значений шейдеров отличаются только типом данных; конкретное использование описано внутри компонента `ShaderColor`.

## ShaderMacro

Этот компонент шейдера позволяет свободно определять макросы в шейдере.
![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/QQ%E6%88%AA%E5%9B%BE20201021234849.png)</br>
* `Имя макроса` — имя определяемого макроса.
* `Проверка макроса` — если значение не пустое, проверяет является ли макрос true, если да, то макрос определяется.
* `Тип значения` — тип значения макроса, есть `Значение` и `Логическое значение`.
  * Обратите внимание на методы определения значений макросов в шейдере.
	```
	#pragma define LAYERS range([4, 5])
	#pragma define METALLIC_SOURCE options([r, g, b, a]) 
	```
	[**Синтаксис эффекта**](https://docs.cocos.com/creator3d/manual/zh/material-system/effect-syntax.html "Синтаксис эффекта").
* `Логическое значение` — булево значение.
* `Значение` — число.## Компоненты эффектов серии Effect*Эти компоненты в основном собирают несколько компонентов шейдеров и обеспечивают единое управление ими. Конкретные эффекты создаются с помощью этих компонентов. Вы можете ознакомиться с исходным кодом компонентов Effect* в рамках проекта.

### Встроенные компоненты эффектов:

* **EffectFlashLight** — эффект сканирования светом. Можно настроить скорость, угол, количество, расстояние между лучами и ширину.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectFlashLight.gif)
  
* **EffectFluxaySuper** — эффект потока света. Можно настроить скорость.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectFluxaySuper.gif)

* **EffectGaussianBlur** — эффект высокого гауссового размытия. Из-за возможной проблемы производительности при слишком больших значениях, конфигурация этого компонента недоступна.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectGaussianBlur.jpg)

* **EffectGlowInner** — внутренний эффект свечения. Можно настроить цвет, ширину, пороговое значение и мерцание.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectGlowInner.jpg)

* **EffectGlowOuter** — внешний эффект свечения. Похож на внутренний эффект свечения.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectGlowOutter.jpg)

* **EffectMosaic** — эффект мозаики. Можно настроить степень (от 0 до 1).
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectMosaic.jpg)

* **EffectOutline** — эффект контура. Можно настроить цвет, ширину и мерцание.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectOutline.gif)* **EffectPhoto** — эффект фотографии. Можно настроить старую фотографию, серый оттенок, инверсию, замороженный вид, карикатурность и степень.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectPhoto.jpg)

* **EffectRoundCornerCrop** — эффект округлой обрезки. Можно настроить степень.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectRoundCornerCrop.jpg)

* **EffectSpriteMask** — эффект маски шейдера. Настройка исходного изображения и маски. Для достижения наилучшего результата рекомендуется отключить автоматическую обрезку изображения и сделать размеры исходного изображения и маски одинаковыми.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectSpriteMask.jpg)

* **EffectDissolve** — эффект растворения. Настройка шума и степени.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectDissolve.jpg)

* **EffectSmoothTransform** — эффект плавного перехода. Настройка ширины перехода, направления перехода и степени.

* **EffectRainDropRipples** — эффект дождевых волн. Настройка плотности волн и динамического изменения.
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectRainDropRipples.jpg)
  ![avatar](https://gitee.com/nomat/lcc-render/raw/master/docs/EffectRainDropRipples.gif)

На самом деле, после добавления этих встроенных эффектных компонентов вы также можете добавить другие шейдерные компоненты, если шейдер поддерживает соответствующие данные. Например, встроенный мозаичный компонент не имеет настройки цвета, но вы вполне можете добавить компонент ShaderColor на узел для управления цветом.# Заключение
Этот фреймворк упрощает и расширяет способы передачи данных в шейдеры Creator. Мы можем сосредоточиться на создании качественных шейдеров, а затем использовать этот фреймворк для настройки способов передачи данных в зависимости от конкретной ситуации, чтобы достичь желаемого результата. Внутри фреймворка уже включены некоторые эффекты, и он будет регулярно обновляться за счет переноса эффектов из других источников (например, shadertoy).

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/nomat-lcc-render.git
git@api.gitlife.ru:oschina-mirror/nomat-lcc-render.git
oschina-mirror
nomat-lcc-render
nomat-lcc-render
master