OpenGL / JOGL: Mehrere Dreiecksfächer in einem Vertex-Array

8

Ich arbeite daran, einige moderat einfache Formen mit Vertex-Arrays zu erstellen, und ich mache gute Fortschritte, aber jetzt möchte ich zwei (oder mehr) dreieckige Fan-Objekte zeichnen. Gibt es eine Möglichkeit, nur einen Aufruf an gl.glDrawArrays(GL.GL_TRIANGLE_FAN,... zu machen oder muss ich einen separaten Anruf für jeden Fan machen?

Der Wikipedia Dreieckstrip beschreibt einen so genannten primitiven Neustart, aber OpenGLs Vertex Specification lässt mich glauben, dass dies nicht mit Vertex-Arrays funktioniert.

Wie kann man mehrere Dreiecksfächer richtig zeichnen? Hier ist meine aktuelle Zeichenmethode:

%Vor%

Bearbeiten

Ich habe den relevanten Abschnitt von draw wie folgt aktualisiert:

%Vor%

Dabei ist fanDist der Offset (vom Anfang der Lüfter) des Anfangs dieses Lüfters und fanLength ist die Länge dieses Lüfters.

Das scheint zu funktionieren, das ist nett, aber trotzdem, ist das der richtige Weg, dies zu tun? Gibt es einen besseren Weg?

    
dimo414 08.12.2010, 11:24
quelle

1 Antwort

15
___ qstnhdr ___ OpenGL / JOGL: Mehrere Dreiecksfächer in einem Vertex-Array ___ antwort4387342 ___

Primitive Neustart funktioniert mit Vertex-Arrays und Vertex-Puffer - es wäre nicht wirklich nützlich, wenn es nicht tat.

Es stimmt jedoch, dass es in Verbindung mit glDrawArrays nicht sinnvoll ist.

Sehen wir uns zwei Techniken an:

Primitiver Neustart

Lassen Sie mich Ihnen glDrawElements vorstellen: Ein Anruf wie

%Vor%

ist analog zu

%Vor%

Anstatt einen Bereich von Elementen anzugeben, die aus einem Array gezeichnet werden sollen, geben Sie exakte Indizes dieser Elemente an.

Und dann können Sie primitiven Neustart mit einem solchen Array einführen:

%Vor%

Dies wird einen Fan aus den ersten 4 Ecken zeichnen, dann wird auf das "Zeichen" stoßen, um das Grundelement neu zu starten, und dann wird ein weiterer Fan der letzten 4 Ecken gezeichnet.

Die an DrawElements übergebenen Indizes müssen kein fortlaufender Bereich sein! Sie können in beliebiger Reihenfolge sein und können beliebig wiederholt werden - das ist der beste Teil dieser Funktion. In der Tat ist es am besten, einen Index so oft wie möglich wiederzuverwenden, da er nur einmal vom Vertex-Shader verarbeitet wird, wenn das Ergebnis zwischengespeichert wird. Sie können also Puffer erstellen wie:

%Vor%

MultiDrawElements

In Ihrem Fall möchten Sie vielleicht stattdessen glMultiDrawElements verwenden.

Wenn Sie, sagen wir, 20 Ecken haben, und Sie einen Fan von 8 Ecken beginnend vom ersten und einen Fan von 10 Ecken beginnend vom 10. ziehen möchten, können Sie so etwas tun:

%Vor%

Damit haben Sie etwas weniger zu tun.

Wählen Sie die Technik, die Sie nützlicher finden. Ich überlasse es Ihnen, das in Java / JOGL neu zu schreiben, das Prinzip ist das gleiche, aber Sie müssen die Buffer -Klasse für all diese verwenden, denke ich.

    
___ qstntxt ___

Ich arbeite daran, einige moderat einfache Formen mit Vertex-Arrays zu erstellen, und ich mache gute Fortschritte, aber jetzt möchte ich zwei (oder mehr) dreieckige Fan-Objekte zeichnen. Gibt es eine Möglichkeit, nur einen Aufruf an %code% zu machen oder muss ich einen separaten Anruf für jeden Fan machen?

Der Wikipedia Dreieckstrip beschreibt einen so genannten primitiven Neustart, aber OpenGLs Vertex Specification lässt mich glauben, dass dies nicht mit Vertex-Arrays funktioniert.

Wie kann man mehrere Dreiecksfächer richtig zeichnen? Hier ist meine aktuelle Zeichenmethode:

%Vor%

Bearbeiten

Ich habe den relevanten Abschnitt von draw wie folgt aktualisiert:

%Vor%

Dabei ist fanDist der Offset (vom Anfang der Lüfter) des Anfangs dieses Lüfters und fanLength ist die Länge dieses Lüfters.

Das scheint zu funktionieren, das ist nett, aber trotzdem, ist das der richtige Weg, dies zu tun? Gibt es einen besseren Weg?

    
___ tag123jogl ___ JOGL ist die Java-Bindung für die OpenGL- und OpenGL-ES-API. JOGL bietet vollständigen Zugriff auf die APIs in der OpenGL 1.3 - 3.0, 3.1 - 3.3, ≥ 4.0, ES 1.x und ES 2.x Spezifikation. ___ tag123vertexarray ___ hilf uns dieses Wiki zu bearbeiten ___ tag123polygon ___ Probleme beim Erstellen und Rendern von Polygonen in grafischen Benutzeroberflächen. ___ tag123opengl ___ OpenGL (Open Graphics Library) ist ein Grafikstandard und eine API, die plattformunabhängig und für Desktops, Workstations und mobile Geräte verfügbar ist. Es wurde entwickelt, um hardwarebeschleunigtes Rendering bereitzustellen und bietet daher eine erheblich verbesserte Leistung gegenüber dem herkömmlichen Software-Rendering. OpenGL wird für Anwendungen wie CAD-Software und Computerspiele verwendet. Der OpenGL-Standard sowie OpenGL ES werden von der Khronos-Gruppe gesteuert. ___
Kos 08.12.2010, 12:19
quelle

Tags und Links