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

Но самое главное, какой алгоритм лучше для этого?

0 ответов

Другие вопросы по тегам