Ich versuche, ein Spiel mit opengl zu schreiben, aber ich habe viel Ärger mit den neuen glkit-Klassen und der Standardvorlage von iOS.
%Vor%Damit wird der Puffer gelöscht (zu einer grauen Farbe), aber nichts aus dem Vertex-Array wird gerendert. Ich habe keine Ahnung, was ich von hier aus tun soll und aufgrund des Alters der Technologie gibt es nicht viele Informationen darüber, wie man glkit richtig einsetzt.
Ich sehe nichts in Ihrem Setup-Code, der Ihre Shader lädt - ich nehme an, Sie tun dies irgendwo in Ihrem Code?
Außerdem erstellen Sie in Ihrem Setup-Code Ihren Framebuffer. Der GLKView
erledigt das für Sie - Sie sagen tatsächlich, dass Sie in Ihrer viewDidLoad
-Methode einen 24-Bit-Tiefenpuffer verwenden sollen:
Also, was dein glkView:drawInRect:
Code oben macht, sagt: "Bindet meinen handgemachten Framebuffer und zieht ein paar Sachen hinein". Die GLKView
stellt sich dann automatisch selbst dar, aber es wurde nichts in sie hineingezogen, Sie haben nur in Ihren handgemachten Puffer gezogen. Wenn Sie keine zusätzlichen Framebuffer-Objekte für Aufgaben wie das Rendern in die Textur benötigen, müssen Sie sich überhaupt nicht mit der Erstellung von Framebuffern beschäftigen - lassen Sie %%_in% dies automatisch tun.
Was Sie in Ihrer GLKView
-Methode (oder an einer anderen Stelle im Setup) tun sollten, ist das Erstellen Ihrer Vertex-Array-Objekte, die sich an den OpenGL-Status erinnern, der für die Ausführung einer Zeichnung erforderlich ist. Dann sollten Sie in der setupGL
Methode:
glkView:drawInRect:
. glClear()
oder glDrawArrays()
. Der glDrawElements()
setzt seinen Kontext automatisch als aktuell und bindet sein Framebuffer-Objekt vor jedem Zeichenzyklus.
Vielleicht probierst du GLKView
eher wie eine normale GLKView
. Es behandelt den größten Teil des OpenGL-Codes hinter den Kulissen und lässt Sie einfach sagen, was es zum Zeichnen benötigt. Es hat seinen UIView
code genau wie ein reguläres drawRect:
- mit einem normalen UIView
in UIView
sagst du ihm einfach, was es zeichnen soll, zum Beispiel mit Core Graphics Funktionen - du sagst es dann nicht zu präsentieren sich selbst.
Die drawRect:
wird dann am besten als die Mechanik der Rendering-Schleife hinter den Kulissen behandelt. Sie müssen die Timer nicht implementieren oder müssen sich sogar darum kümmern, dass die Animation für Ihre Anwendung unterbrochen wird, wenn Sie den Hintergrund aufrufen. Sie müssen nur die GLKViewController
oder update
-Methode überschreiben (abhängig davon, ob Sie Unterklassen oder Delegieren durchführen), um den Status der openGL-Objekte oder der Ansichtsmatrix zu aktualisieren.
Ich habe einen Beitrag über die Einrichtung einer einfachen Projektvorlage mit GLKit geschrieben. Sie können es hier finden:
Ich habe das GLKit noch nicht benutzt, aber es scheint, dass Sie Ihren Framebuffer nicht darstellen, nachdem Sie hineingezogen haben. In einer Anwendung, die OpenGL ES 2 unter iOs aber ohne GLKit verwendet, rufe ich den folgenden Code am Ende der Rendering-Schleife auf.
%Vor%}
Wie gesagt, ich habe GLKit noch nicht benutzt, also hoffe ich, dass das nützlich sein könnte.
Da GLKit die Rendering-Pipeline von OpenGL ES 1.1 nachahmt, müssen Sie die Routinen zum Definieren von Shader nicht hinzufügen. GLK tut dies tatsächlich für Sie, wenn Sie eine einfache Pipeline wie OpenGL ES1.1 verwenden möchten.