Вы можете использовать точечные спрайты, чтобы эмулировать это. Просто включите точечные спрайты, и вы получите специальную переменную 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
даже быстрее, чем эта, оптимизирована для вычисления длины и может быть реализована непосредственно в аппаратном обеспечении.