Holen Sie Daten von der OpenGL-glReadPixels(mit Pyglet)
Ich bin mit Pyglet(und OpenGL) in Python auf eine Anwendung, die ich versuche zu verwenden, glReadPixels, um die RGBA-Werte für einen Satz von Pixeln. Es ist mein Verständnis, dass OpenGL die Daten zurück, die als gepackte zahlen, denn das ist, wie Sie auf der hardware gespeichert sind. Aber für offensichtliche Gründe, warum ich mag würde, um es in ein normales format für die Arbeit mit. Basierend auf einigen zu Lesen, ich habe es mit dieser: http://dpaste.com/99206/ , jedoch nicht mit einem IndexError. Wie würde ich gehen über das tun dies?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie zuerst ein array vom richtigen Typ sind, dann geben Sie auf glReadPixels:
Um dies zu testen, legen Sie die folgenden in der Pyglet "opengl.py" Beispiel:
Nun sehen Sie die Farbe code für den pixel unter dem Mauszeiger, wenn Sie klicken Sie irgendwo in der app-Fenster.
a
alsGLubyte
und mitGL_UNSIGNED_BYTE
. Wenn Sie diejenigen, die ausgewählte Farbe wird wiederkommen, wie Werte von 0 bis 255, anstatt unverständlichlong
s.Können Sie mithilfe der PIL-Bibliothek, hier ist ein code-snippet, das ich verwenden, um zu erfassen, wie ein Bild:
Ich Schätze, einschließlich der alpha-Kanal sollte ziemlich geradlinig (wahrscheinlich nur den Austausch mit RGB -, RGBA, aber ich habe nicht versucht).
Edit: ich war nicht bewusst, dass die pyglet OpenGL-API unterscheidet sich von der PyOpenGL ein. Ich denke, man muss, ändern Sie den obigen code verwenden, den Puffer als das siebte argument (entsprechend der weniger pythonic pyglet-Stil).
War ich in der Lage, um den gesamten frame-Puffer mit
glReadPixels(...)
, dann verwendet die PIL zu schreiben, aus einer Datei:War ich nicht interessiert in der alpha, aber ich bin sicher, Sie könnte leicht fügen Sie es in.
War ich gezwungen zu verwenden
glReadPixels(...)
statt der Pyglet-codeda die Ausgabe mit
save(...)
war nicht identisch mit dem, was ich sah in das Fenster. (Multisampling-buffer verpasst?)Wenn Sie Lesen das snippet, das Sie verlinken, Sie können verstehen, dass die einfachste und die Art und Weise, um die "normalen" Werte ist nur der Zugriff auf das array in der richtigen Reihenfolge.
Das snippet sieht aus wie es soll, die Arbeit zu tun. Wenn es nicht, zu Debuggen und zu sehen was das problem ist.
Auf weitere rezension glaube ich, dass mein original-code basiert auf C-spezifischen code, der funktioniert, weil das array nur ein pointer, also meine mit Zeiger-Arithmetik konnte man an bestimmten bytes, die offensichtlich nicht zu übersetzen, um Python. Hat jemand gewusst wie: extrahieren von Daten mit einer anderen Methode(ich nehme an, es ist nur eine Frage der bit-Verschiebung der Daten).