Warum missbrauchen Sie OpenGL für das? Was Sie dort tun, ist sehr instabil. Zum Beispiel entspricht das von glReadPixels gelesene Pixel nur dann der Scheitelpunktposition, wenn eine sorgfältig ausgewählte Kombination aus Projektions- und Modellansichtsmatrix verwendet wird. Auch jede Iteration von Fill wird eine vollständige Rundreise machen. Nur weil Sie OpenGL verwenden, wird es nicht magisch schnell.
Wenn Sie einen Bereich im Framebuffer überfluten möchten, lesen Sie den gesamten Framebuffer aus, tun Sie den Floodfill und schieben Sie das Ergebnis zurück zu OpenGL. Auch wenn ein Teil des Framebuffers verdeckt ist (durch ein Fenster oder ähnliches), sind diese Teile nicht
Nun zu verstehen, warum Sie in einer unendlichen Rekursion enden. Bedenken Sie:
fill(4, 4)
wird fill(5, 4)
nennen fill(5, 5)
rufen rufen fill(4, 5)
fill(4, 4)
Boom
Jetzt haben Sie, dass Testanruf wird es bekam:
if(pixval[0] == pixvali[0] &&
pixval[1] == pixvali[1] &&
pixval[2] == pixvali[2])
Beachten Sie, dass dies wahr ausgewertet Wenn das zu setzende Pixel bereits die Zielfarbe hat, wird es wieder zu einer endlosen Rekursion. Sie sollten für Ungleichheit testen.
Last but not least: Ein Bild kann leicht von Millionen von Pixeln besteht. Übliche Stapelgrößen erlauben nur maximal einige 1000 Verschachtelungsebenen, so dass Sie Ihre Tail-Rekursion in eine Iteration konvertieren müssen.
TL; DR: Verwenden Sie nicht OpenGL dafür, arbeiten Sie auf einem lokalen Puffer, verwenden Sie geeignete Iteration Condition Test und verwenden Sie Iteration anstelle von Rekursion (oder verwenden Sie eine funktionale Sprache, dann wird der Compiler für diese Tail-Rekursion sorgen).
http://en.wikipedia.org/wiki/Flood_fill
Und fügen Sie die Sprache den Tags hinzu. Es könnte wie C aussehen, aber es gibt eine ganze Reihe von Sprachen, die wie C aussehen: – extraneon
sind die Pixelwerte irgendwo gesetzt? – Dario
Meine Kristallkugel sagt mir "pixvali" ist die Farbe, die Flut gefüllt werden sollte. –