Я успешно реализовал шейдер cel, используя glsl. Но моя проблема заключается в том, чтобы обрисовать в общих чертах все, и каждый пример opengl в Интернете довольно старый, не соответствует современным технологиям, поэтому медленные методы и т. Д. Так что я все равно не смог найти, чтобы сделать это в glsl. Я думал о некоторых идеях, таких как окрашивание наименее интенсивных областей в черный цвет, но нет даже достаточного объяснения относительно gl_Vertex, gl_Position и положения глаз. Итак, поскольку каждая техника слишком старая, я, наконец, решил спросить кого-нибудь об этой проблеме с набросками.
Алгоритм OpenGL GLSL Cel Shading и Outline
Ответы:
Я бы использовал какой-то фильтр обнаружения краев в zbuffer (потенциально может быть объединен с обнаружением краев в цветовом буфере), а затем модулировал бы фреймбуфер с (инвертированным) результатом. Одним из наиболее распространенных фильтров обнаружения границ является оператор Собеля:
http://en.wikipedia.org/wiki/Sobel_operator
РЕДАКТИРОВАТЬ: Еще один дешевый способ сделать это — перед рендерингом обычного меша нарисовать черную копию меша с инвертированной отбраковкой и слегка сдвинутыми вершинами в направлении нормали. Это, вероятно, то, что они сделали в XIII, я также уверен, что это было сделано в Jet Set Radio.
EDIT2: если вы хотите, чтобы толщина контура была постоянной независимо от расстояния до зрителя, вы должны масштабировать величину, на которую вы перемещаете вершины с этим расстоянием.
Вы смотрели на glPolygonOffset?
Я использовал его для рисования контуров поверх заполненных полигонов.
http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPolygonOffset.xml