Как динамически заполнить цвет в многоугольнике в OpenGL
Я создаю программу в OpenGL с использованием перенасыщенности, в которой пользователь может рисовать линии или круги на экране, выбирая соответствующую опцию и перетаскивая левую кнопку мыши на экране. Кроме того, я хочу, чтобы пользователь мог заполнить цвет в многоугольнике (который можно нарисовать комбинацией нескольких линий), когда он щелкнет правой кнопкой мыши.
Я попытался реализовать алгоритм заливки, используя glReadPixels(), чтобы рекурсивно определить цвет каждого пикселя, но он слишком медленный и приводит к переполнению стека для пикселей большего размера.
(Первоначально я выполняю эту инструкцию в точке, где нажата правая кнопка мыши, чтобы сохранить значения RGB в массиве backColor из 3-х float-элементов)
glReadPixels(x,y,1,1,GL_RGB,GL_FLOAT,backColor);
Код для заливки, который я реализовал, -
void floodfill(int x, int y)
{
glBegin(GL_POINTS);
glVertex2f(x,y);
glEnd();
glReadPixels(x-1,y,1,1,GL_RGB,GL_FLOAT,curColor);
if (checkColor(backColor,curColor))
{
floodfill(x-1,y);
}
glReadPixels(x,y-1,1,1,GL_RGB,GL_FLOAT,curColor);
if (checkColor(backColor,curColor))
{
floodfill(x,y-1);
}
glReadPixels(x+1,y,1,1,GL_RGB,GL_FLOAT,curColor);
if (checkColor(backColor,curColor))
{
floodfill(x+1,y);
}
glReadPixels(x,y+1,1,1,GL_RGB,GL_FLOAT,curColor);
if (checkColor(backColor,curColor))
{
floodfill(x,y+1);
}
}
int checkColor(float a[], float b[])
{
if ((a[0] == b[0]) && (a[1] == b[1]) && (a[2] == b[2]))
return 1;
return 0;
}
Итак, как лучше всего закрасить многоугольник (возможно, вогнутый многоугольник) правой кнопкой мыши? Кроме того, каковы различные способы сделать программу более эффективной? Например, сохранение значения пикселя в виде GL_FLOAT и сравнение трех чисел с плавающей запятой для каждого пикселя, возможно, не самый эффективный способ, которым я себя чувствую, но я не знаю, каковы другие возможные способы сравнения значений пикселей.
Но самое главное, какой алгоритм лучше для этого?