суббота, 5 декабря 2015 г.

Candide

Скоро у нас будет новый кандид:


Вместо стандартного рисования линий средствами OpenGL ES я решил расчитывать сглаженную линию в шейдере. Для этого вокруг каждой линии рисуется "конвертик"из triangle-strip и в шейдер передаются начало и конец отрезка и его толщина. В шейдере рассчитывается расстояние от фрагмента до центра линии, плюс добавлен суперсемплинг 16x для максимально сглаженного результата. Вся геометрия рисуется одним вызовом.

Сначала "конвертики" рисовались с включенным аддитивным блендингом, чтобы линии нормально накладывались друг на друга. Но это приводит к всеобщей распространнённой проблеме ярких "узелков", где сходится больше двух линий:


В итоге было решено задействовать расширение EXT_shader_framebuffer_fetch которое доступно начиная с iPhone 6. Благодаря заточенности железа под тайловый рендеринг, в шейдере вы можете получить цвет фрагмента из render target-а, что недоступно на десктопных графических картах в силу их не-тайловой архитектуры. Имея доступ к цвету в памяти, вы можете сложить его с цветом полученным в шейдере так, как вам удобно - получив по сути программируемый блендинг. Сделав так, чтобы суммарная яркость не превышала уже существующий порог, можно избавиться от ярких "узелков".

На FullHD экране телефона новый кандид выглядит очень здорово!

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

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