Как пересечь две гладкие фигуры в OpenGL?

Я успешно нарисовал две гладкие фигуры в OpenGL, используя процедуру, которая генерирует треугольную полосу, крайняя крайняя линия которой имеет все вершины в точке alpha 0. Теперь я хочу пересечь их, но мне всегда кажется, что я теряю гладкие края одной формы. Вот код, который я использую:

// Draw: smooth black shape as normal

glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE);
// Draw: smooth black shape into alpha channel

glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glBlendFunc(GL_DST_ALPHA, GL_SRC_ALPHA);
// Draw: Yellow overlay shape with black shape's alpha

// Reset blending modes for rest of program

Комбинированные формы

И вот результат (внизу) — желтая фигура теряет свой гладкий правый край, потому что альфа в этих пикселях теперь равна 1. Как я могу получить гладкую пересекающуюся форму?


person Dan Halliday    schedule 14.03.2013    source источник


Ответы (2)


Вам нужно что-то вроде этого фрагмента:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glBlendEquation(GL_FUNC_ADD);
glEnable(GL_BLEND);

Я думаю, что ключевым элементом является glEnable(GL_BLEND).

person marekb    schedule 14.03.2013
comment
Спасибо за совет glBlendEquation. К сожалению, я все еще не могу заставить его работать ни с одним из GL_FUNC_ADD, GL_FUNC_SUBTRACT или GL_FUNC_REVERSE_SUBTRACT. - person Dan Halliday; 15.03.2013

Я долго боролся с этой проблемой и пробовал каждый порядок рисования и комбинации glColorMask и glBlendEquation. В конце концов я понял, что есть очень простое решение — предварительно умноженная альфа.

В моей процедуре рисования «сглаженной формы» вместо того, чтобы рисовать внешний край сглаживания того же цвета, alpha=0, я разрешил указывать внешний цвет сглаживания. Для желтой формы я указал черный цвет, и это дало мне сглаженный край, в то время как вся фигура имеет сглаженный край — даже несмотря на то, что правый край желтой фигуры не маскируется альфа-каналом.

person Dan Halliday    schedule 25.07.2013