OpenGL ES: Grundformen (Dreiecke) zeichnen

Ursprünglicher Autor: Simon Maurice
  • Übersetzung
Grundfiguren (Primitive) sind die Grundelemente, aus denen beim Zeichnen komplexe Objekte aufgebaut werden. In OpenGL ES sind solche Grundelemente die Objekte Punkt (Linie), Linie (Linie), Dreieck (Dreieck). Ich denke, ihre Namen sprechen für sich.

In dieser Lektion analysieren wir den Code, anhand dessen später eigene Projekte erstellt werden können.

Primitive Nummer 1 - Dreiecke


Dreiecke sind die komplexesten Grundformen, aber sie sind so praktisch und nützlich, dass wir mit ihnen beginnen werden. Um ein Dreieck zu zeichnen, müssen Sie OpenGL drei Koordinaten des dreidimensionalen Raums angeben - den Rest erledigt das Programm selbst.

Erstellen Sie zunächst eine Kopie des Projekts aus der Lektion " OpenGL ES: Einrichten eines Projekts in Xcode " oder laden Sie den Quellcode von hier herunter . Wechseln Sie bei geöffnetem Projekt in Xcode zur Datei " EAGLView.m " und suchen Sie die Methode " drawView ". Echte Magie beginnt!

Der erste Schritt besteht darin, die Parameter des Dreiecks einzustellen. Ich mache sofort darauf aufmerksam, dass wir mit den Koordinaten zweier Typen arbeiten werden: Model und World. Koordinaten Modell gehört in dem primitiven gezogen, und die Koordinaten des Weltberichtes OpenGL seine Position in Bezug auf den Betrachter (die im Raum der Welt ist immer am Punkt (0.0, 0.0, 0.0)).

Wir setzen also die Koordinaten des Dreiecks im Modellraum durch drei dreidimensionale Koordinaten (X, Y, Z): Beachten Sie, dass die Koordinaten nacheinander im Gegenuhrzeigersinn beschrieben werden (es kann das Gegenteil sein - Hauptsache, Sie setzen sie nacheinander und halten sich an ein einzelnes Schema). Zunächst würde ich empfehlen, nach dem Schema „gegen den Uhrzeigersinn“ zu arbeiten, da genau diese Reihenfolge für einige der nachfolgend betrachteten Funktionen erforderlich ist.

const GLfloat triangleVertices[] = {
0.0, 1.0, -6.0,// Верхняя центральная точка треугольника
-1.0, -1.0, -6.0,// нижняя левая
1.0, -1.0, -6.0,// нижняя правая
};




Obwohl es in unserer Lektion um die iPhone OpenGL ES- Technologie geht , werde ich mich für Anfänger kurz mit einem dreidimensionalen Koordinatensystem befassen. Schauen Sie sich die Zeichnung an:

Weltraum

Lassen Sie uns von meinen künstlerischen Fähigkeiten abschweifen und sehen, wie der Modell- (oder Welt- ) Raum aussieht . Stellen Sie sich vor, es handelt sich um einen Computermonitor, bei dem X und Y die horizontale bzw. vertikale Achse und Z die Tiefe sind. Der Mittelpunkt entspricht den Koordinaten (0.0, 0.0, 0.0).

Betrachten wir nun das Dreieck als auf diese Achsen angewendet, so ist der erste Punkt (0.0, 1.0, -6.0) sein Mittelpunkt auf der Y-Achse, verschoben um einen Punkt und sechs Punkte in der Tiefe des Bildschirms. Die zweite Koordinate ist ein Punkt rechts von der Y-Achse unterhalb der X-Achse (da der Y-Wert -1,0 beträgt) und sechs Punkte in der Bildschirmtiefe (-6,0). Genauso wird die dritte Koordinate analysiert.

Der Wert von Z wird negativ gemacht, um das Objekt zurückzuschieben und sichtbar zu machen (vergessen Sie nicht, dass sich die „Kamera“ am Punkt befindet (0.0, 0.0, 0.0), damit das Objekt den OpenGL- Test nicht bis in die Tiefe besteht und nicht visualisiert wird).

Jemand wird sofort bemerken: „Es wurde gesagt, dass wir mit den Koordinaten von Model und nicht von World arbeiten! ”Das ist wahr, aber wenn wir zur Visualisierung des Dreiecks kommen, setzt OpenGL das Objekt sofort an den Punkt (0.0, 0.0, 0.0). Deshalb schieben wir es jetzt in die Tiefe des Bildschirms und machen es sichtbar. Später ist es unter Berücksichtigung von Transformationen (Verschiebung, Drehung usw.) möglich, ein solches Ergebnis zu erzielen, ohne auf negative Werte zurückzugreifen. Bis dahin belassen wir den Wert -6.0 für die Z-Koordinate.

Zeichnungscode


Nun können wir das Dreieck beschreiben, indem wir OpenGL mitteilen, wo die Daten gespeichert sind und wie das Grundelement gezeichnet werden soll. Dazu reichen uns ein paar Zeilen Code. Kehren Sie zur drawView- Methode zurück und implementieren Sie sie wie folgt : Wie Sie sehen, reichen vier Codezeilen aus, um ein Dreieck zu rendern. Wir werden jeden von ihnen analysieren, um sicherzustellen, dass alles sehr einfach ist. Diese Zeile löscht den Bildschirm. Die Steuerbits weisen OpenGL an, die in der letzten Lektion in der setupView- Methode angegebene schwarze Farbe zu verwenden und den Tiefenpuffer zu löschen. Wenn Sie den Puffer anschließen, wird die Szene nicht gerendert. Wenn der Puffer nicht verbunden ist, werden bei der Übertragung von glClear () Nachrichten GL_DEPTH_BUFFER_BIT

- (void)drawView {

const GLfloat triangleVertices[] = {
0.0, 1.0, -6.0, // Верхняя центральная точка треугольника
-1.0, -1.0, -6.0, // нижняя левая
1.0, -1.0, -6.0 // нижняя правая
};

[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
glViewport(0, 0, backingWidth, backingHeight);

// -- НАЧАЛО НОВОГО КОДА

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glVertexPointer(3, GL_FLOAT, 0, triangleVertices);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 3);

// -- КОНЕЦ НОВОГО КОДА

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];

[self checkGLError:NO];
}




glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


keine Notwendigkeit.

Also haben wir alles gelöscht, was zuvor in den Puffer gezeichnet wurde (Haben Sie die doppelte Pufferung vergessen? In einem Puffer zeichnen wir, den anderen zeigen wir an). Die Funktion informiert OpenGL über den Speicherort der Daten und deren Format. Es hat vier Parameter, die so einfach wie möglich sind: 1. Größe: Die Anzahl der Werte in jeder Koordinate. In unserem Fall gibt es drei davon (X, Y, Z). Beim Zeichnen von zweidimensionalen Objekten ohne Tiefe ( dh dem Z-Wert) wird die Zahl 2 angegeben. 2. Datentyp: GL_FLOAT bedeutet ein Gleitkommawert. Wenn gewünscht, sind auch ganze Zahlen zulässig, aber in dreidimensionalen Räumen können Gleitkommazahlen nicht weggelassen werden. 3. Berechnungsschrittweite: Berichte OpenGL

glVertexPointer(3, GL_FLOAT, 0, triangleVertices);






über eine bestimmte Anzahl von Bytes zwischen den Koordinaten zu ignorieren. Lassen Sie diesen Parameter bis jetzt unbesorgt - lassen Sie ihn gleich Null. Sie werden damit arbeiten, wenn Sie Daten zu Eckpunkten aus einer Datei laden, deren Format Informationen zum Ausfüllen der Lücken oder Farbdaten enthält, z. B. aus der Anwendung 3D Blender.
4. Datenzeiger - tatsächlich die Daten selbst.

Also schlugen wir OpenGL vor, um den Puffer zu löschen, spezifizierten Daten für das Objekt und meldeten sein Format. Es ist Zeit für eine entscheidende Botschaft. OpenGL arbeitet mit Zuständen. Dies bedeutet, dass die Funktionen durch entsprechende Befehle aktiviert und deaktiviert werden. Oben haben wir den Befehl " glEnable () " verwendet, der mit dem "Server" -Modus von OpenGL funktioniert . Team "

glEnableClientState(GL_VERTEX_ARRAY);


glEnableClientState () " aktiviert den" Programm "-Modus (dh den Client-Status). Zur Zeit haben wir OpenGL darüber informiert, dass sich die Eckendaten in einem separaten Array befinden, und die OpenGL- Funktion zum Zeichnen des Eckpunkts aktiviert . Theoretisch kann der Eckpunkt ein Array von Farben sein (in dieser Fall sollte auf die „beziehen sich glEnableClientState (GL_COLOR_ARRAY )“) oder eine Anordnung von Texturkoordinaten mit Textur - Mapping (genug , um zu seufzen! eine Textur zu verhängen, wir müssen zuerst die Grundlagen lernen!).

B. die Entwicklung von OpenGL wir an die Arbeit mit verschiedenen Client - Zustand haben, so dass die Zeit p ZBOROV dieses Thema nach wie vor ist.

Es ist das Team Zeit , um ein Dreieck zu machen: Wenn Sie diese Funktion aufrufen, OpenGL

glDrawArrays(GL_TRIANGLES, 0, 3);


verarbeitet Informationen aus den beiden vorherigen Funktionen. Auf dem Bildschirm wird ein Dreieck mit einer weißen Füllung angezeigt (Weiß - die Standardfarbe beim Zeichnen). Dreiecke sind Objekte mit einer Füllung. Um ein leeres Dreieck zu zeichnen, benötigen Sie eine andere Technik.

Wir analysieren drei Argumente dieser Funktion:
1. Zeichenmethode: in diesem Fall " GL_TRIANGLES ", dessen Name an sich ziemlich beredt ist. Wir werden später die Möglichkeit haben, das Potenzial des ersten Arguments zu bewerten, wenn wir diese Funktion verwenden, um ein Quadrat zu zeichnen.
2. Erster Eckpunkt: Unser Array besteht nur aus drei Punkten. Wir wollen OpenGLAb dem ersten Punkt des Arrays, der als Null angegeben ist (Standardzugriff auf das Array). Wenn das Vertex-Array mehrere Grundelemente enthalten würde, wäre ein Versatz angemessen. Mehr dazu in den folgenden Lektionen, die sich auf die Erstellung komplexer Objekte konzentrieren. Vorerst sei es Null.
3. Anzahl der Scheitelpunkte: teilt OpenGL mit, wie viele Scheitelpunkte im Array gezeichnet werden. Für ein Dreieck gibt es natürlich drei, für ein Quadrat - 4, für eine Linie - 3 (oder mehr), für einen Punkt - einen (oder mehr, wenn Sie mehrere Punkte visualisieren).

Nachdem der Code eingegeben wurde und die Methode " drawView " auf die obige Ansicht reduziert wurde, klicken Sie auf die Schaltfläche " Build and Go ". So etwas wie diese „ , um das Projekt im Simulator Ausgabe läuft dann schauen, wie es erwartet wurde . - Ein weißes Dreieck in der Mitte des Bildschirms ,

Dreieck

bevor Sie mit den folgenden Grundelementen fortfahren versuchen , den Wert des Z zu ändern, und Sie werden sehen , dass der Wert von 0.0 - Wiedergabe nicht durchgeführt wird.

Viel zu ein paar Zeilen Code Erklärungen Got Ich hoffe, dass diejenigen, die bereits über die "typischen" OpenGL- Lektionen gestolpert sind, den Unterschied zwischen OpenGL und OpenGL ES bereits verstanden haben .

Den Quellcode für die Lektion können Sie hier herunterladen .

Jetzt auch beliebt: