Update für die OpenGL-Renderschleife in PyQt

Ich versuche gerade mich in das Thema Raytraching bzw. Raymarching einzuarbeiten. Dabei bin wieder auf mein Qt-OpenGL-Programmgerüst zurückgekommen, dass ich in einem meiner letzten Artikel beschrieben habe. Leider hat das Skript nicht auf Anhieb auf einem neuen Rechner funktioniert, was ich auf unterschiedliche Implementierungen der OpenGL-Bibliothek in Qt oder gar den Grafiktreiber zurückführe. Bestimme von mir verwendete Befehle erzeugten Fehlermeldungen, u.a. konnte ich das OpenGL-Viereck für das Fraktal nicht per QL_QUADS zeichnen. Ich habe also das Programmgerüst etwas angepasst und auf reine OpenGL ES 2.0 Befehle reduziert. Statt einem Viereck zeichne ich jetzt zwei Dreiecke, die ich per Vertex Array übergebe. Ich benutze dafür die Methode glDrawElements(), der ich die Indizes auf die einzelnen Dreickspunkte im Vertex Array übergebe. Die render-Schleife sieht jetzt in etwa folgendermaßen aus:

gl.glViewport(0, 0, self.width(), self.height())
gl.glClear(gl.GL_COLOR_BUFFER_BIT)

self.program.bind()

vertices = array.array("f", [
     1,  1, 0,
    -1,  1, 0,
    -1, -1, 0,
     1, -1, 0
])

indices = array.array("B", [0,1,2,0,2,3])

gl.glEnableVertexAttribArray(self.vAttr)
gl.glVertexAttribPointer(self.vAttr,
    3,
    gl.GL_FLOAT,
    gl.GL_FALSE,
    0,
    vertices)
gl.glDrawElements(gl.GL_TRIANGLES, 6, gl.GL_UNSIGNED_BYTE, indices)
gl.glDisableVertexAttribArray(self.vAttr)

self.program.release()

Diese Gerüst eignet sich damit auch hervorragend für erste Raymarching-Experimente, da letztendlich wiederum nur ein simples Viereck mit den Eckpunkten [-1, -1] und [1, 1] gezeichnet wird. In dieses hinein lassen sich dann per Shader Fraktale oder eben Raytracing-Objekte zeichen. Allgemein scheint PyQt eine schöne Umgebung für Shader-Experimente zu sein, wie ich immer wieder festestellen muss. Mit dem Programmgerüst kann man schnell die Shader sowie deren Input und Output modifizieren. Der Screenshot oben basiert auf den Shadern des 4k-Intro-Frameworks von iquilezles.org, eine fantastische Website zum Thema Grafikprogrammierung und interessanten Artikeln zum Thema Raymarching. Hier ist noch der Link zu meinem aktuellen Experiment, das die oben abgebildete Kugel rendert, und das die OpenGL-Renderschleife in Aktion zeigt:

https://github.com/pbouda/stuff/blob/master/opengl/pyqt/raymarching.py

About me

My name is Peter Bouda and I am and Angular/JavaScript coach and consultant at ng-lisbon.com with more than 18 years of professional experience in web application development. I help you to bring your web product to market as quickly as possible.

Join my next Angular workshop at TUGA IT, May 18th, in Lisbon.

Read about my work
or
Contact me

Send me a message and I will get back to you.