Эквивалент OpenGL ES 2.0 для кругов ES 1.0 с использованием GL_POINT_SMOOTH? - PullRequest
5 голосов
/ 30 августа 2011

OpenGL ES 2.0 не имеет определения GL_POINT_SMOOTH, которое имеет ES 1.0. Это означает, что код, который я использовал для рисования кругов, больше не работает:

glEnable(GL_POINT_SMOOTH);
glPointSize(radius*2);
glDrawArrays(GL_POINTS,0,nPoints);

Есть ли в ES 2.0 эквивалент, возможно, что-то добавить в вершинный шейдер, или я должен использовать полигоны для каждого круга?

Ответы [ 2 ]

6 голосов
/ 30 августа 2011

Вы можете использовать точечные спрайты, чтобы эмулировать это. Просто включите точечные спрайты, и вы получите специальную переменную gl_PointCoord, которую вы можете прочитать в фрагментном шейдере. Это дает вам координаты фрагмента в квадрате текущей точки. Вы можете просто использовать их, чтобы прочитать текстуру, которая содержит круг (пиксели не в круге имеют цвет 0), а затем отбросить каждый фрагмент, значение текстуры которого равно 0:

if(texture2d(circle, gl_PointCoord).r < 0.1)
   discard;

РЕДАКТИРОВАТЬ: Или вы можете сделать это без текстуры, торгуя задержкой доступа к текстуре для сложности вычислений и просто оценивая уравнение круга:

if(length(gl_PointCoord-vec2(0.5)) > 0.5)
    discard;

Это может быть дополнительно оптимизировано путем удаления квадратного корня (используется в функции length) и сравнения с квадратным радиусом:

vec2 pt = gl_PointCoord - vec2(0.5);
if(pt.x*pt.x+pt.y*pt.y > 0.25)
    discard;

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

0 голосов
/ 30 августа 2011

И ответ - да, вы должны использовать многоугольники (например, текстурированные квадраты), чтобы получить гладкие точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...