Неожиданная удача, глиф “g” на шейдерах!

 
 
 

У меня таки получилось победить артефакты в рендерах, которые я приводил раньше. Однако это потребовало вычисления в шейдере факта попадания точки в контур глифа. Все это привело к ужасающему падению производительности. Т.к. все кривые глифа задавались аналитически и шейдеру приходилось все это рассчитывать в реальном времени.

В качестве оптимизации можно было бы конечно один раз глиф отрисовать в рендер-таргет, а потом просто блит, но это равносильно предрасчету глифов и просто блиту, разве что не во время разработки, а при старте.

Поэтому аналитическую информацию решено было предрасчитать и “запечь” в текстуру, а потом ей только пользоваться. С учетом фильтрации текстур еще и практически бесплатная интерполяция. С помощью библиотечки Cairo удалось просчитать нужную аналитическую информацию и быренько наваять шейдер. Вот что получилось.

Буква “g” при разных приближениях:

g-1

g-2

g-3

g-4

Как видно контуры плавные даже при огромном увеличении. Задача минимум (а изначально это вообще была задача максимум) достигнуто. Но дальше, как говориться, “Остапа понесло”.

Контур (красный), кроме того еще и плавный:

g-glow

Тень (синяя), тоже плавная:

g-shadow

В принципе и тень и контур можно делать жесткими. Но плавными они эффектнее смотряться.

Ну и как обычно – чайник для антуража, плюс в этот раз еще и цветной куб. Так – эксперименты…