Почему вы злоупотребляете OpenGL для этого? То, что вы там делаете, очень нестабильно. Например, пиксель, считанный с помощью glReadPixels, будет соответствовать только положению вершины, если используется тщательно выбранная комбинация матрицы проекции и модели. Также каждая итерация заполнения будет выполнять полный круговой обход. Только потому, что вы используете OpenGL, он не работает волшебно быстро.
Если вы хотите заполнить какую-то область в кадровом буфере, считайте весь кадровый буфер, выполните заливку и перенесите результат обратно в OpenGL. Также, если какая-то часть кадрового буфера закрыта (окном или подобным), эти части не будут
Теперь, чтобы понять, почему вы оказались в бесконечной рекурсии. Учтите это:
fill(4, 4)
позвонит fill(5, 4)
позвонит fill(5, 5)
позвонит fill(4, 5)
позвонит fill(4, 4)
бум
Теперь у вас есть этот тест:
if( pixval[0] == pixvali[0] &&
pixval[1] == pixvali[1] &&
pixval[2] == pixvali[2] )
Обратите внимание, что это оценивается как истина, если заданный пиксель уже имеет целевой цвет, снова оказываясь в бесконечной рекурсии. Вам нужно проверить на неравенство .
Последнее, но не менее важное: изображение может легко состоять из миллионов пикселей. Обычные размеры стеков допускают не более нескольких уровней вложенности функций, поэтому вам придется преобразовать свою хвостовую рекурсию в итерацию.
TL; DR: не используйте для этого OpenGL, работайте с локальным буфером, используйте надлежащий тест условия итерации и используйте итерацию вместо рекурсии (или используйте функциональный язык, тогда компилятор позаботится об этой хвостовой рекурсии) .
http://en.wikipedia.org/wiki/Flood_fill