четверг, 10 января 2013 г.

Пост-эффекты в Unity. Идем вглубь...

Продолжаем мучить делать в Unity пост-эффекты.


Сразу скажу об одной интересной фишке. Оказывается техническую часть кода вполне можно упустить если образовывать скрипт не от MonoBehavior а от ImageEffectBase, таким образом новый код выглядит так:

using UnityEngine;

[AddComponentMenu("Image Effects/Code Chaos")]
public class CodeChaos : ImageEffectBase {

// Определяем параметры
public float factor = 0.0f;
public Texture CodeTex;
public Texture VignetTex;

void OnRenderImage (RenderTexture source, RenderTexture destination)
{
material.SetFloat("_factor", factor);
material.SetTexture ("_CodeTex", CodeTex);
material.SetTexture ("_VinetteTex", VignetTex);
Graphics.Blit (source, destination, material);
}
}
Да, это так просто. И это работает. Прием подсмотрен от разрабов, хотя я определено должен был догадаться раньше .
Шейдер я тоже изменил, собственно теперь он творит несколько эффектов. Не буду постить здесь код, скажу лишь, что кроме эффекта я заменил все float элементы на fixed, которые гораздо экономичнее по памяти.

Немного о разновидностях флоатов :D
Всего их три типа: float, half, fixed. Обычный флоат может содержать довольно большие цифры и он занимает 32 бита в памяти. half может содержать цифры в диапазоне -60000 +60000, и он занимает 16 бит. fixed может содержать цифры в диапазоне -2 до 2, что за глаза хватит обычным буферам в шейдерах, и занимает он 11 бит. Насколько мне известно, каждый из типов имеет еще и определенные различия в точности расчетов, но я не смог найти точные цифры.
В целом, при написаний шейдеров чаще всего имеет смысл использовать fixed, даже для вертелок (параметры влияющие на шейдер),  ну или half. Затрудняюсь ответить в каком эффекте вообще может понадобится полноценный float...
А вот так выглядит мой эффект:
Хотя на момент написания поста эффект был улучшен и переименован, хотя вы могли уже догадаться по коду.
Я продолжу писать подобные статьи, хотя следующий пост будет посвящен анимации ;).
Впрочем меня щас все равно никто не читает, но возможно в будущем я стану более знаменитым чем сейчас, лол :D

Комментариев нет:

Отправить комментарий