2013-08-05 4 views
7

Ich habe durch die OpenGL-Spezifikation gelesen, die versucht, eine Antwort auf diese Frage ohne Glück zu finden. Ich versuche herauszufinden, ob OpenGL garantiert, dass Zeichnungsaufrufe wie GLDrawElements oder GLDrawArrays Elemente genau in der Reihenfolge zeichnen, in der sie in der VBO erscheinen, oder ob es frei ist, die Fragmente dieser Primitiven in beliebiger Reihenfolge zu verarbeiten.Gewährleistet OpenGL, dass Grundelemente in einem Vertex-Puffer in der Reihenfolge gezeichnet werden?

Zum Beispiel, wenn ich einen Vertex-Puffer mit 30 Vertices habe, die 10 Dreiecke mit jeweils den gleichen Koordinaten repräsentieren. Wird es immer der Fall sein, dass das Dreieck, das den Scheitelpunkten 0, 1 und 2 entspricht, zuerst gerendert wird (und deshalb auf der Unterseite); und das Dreieck, das den Scheitelpunkten 28, 29, 30 entspricht, wird immer als letztes (und deshalb oben) dargestellt?

Antwort

12

Die Spezifikation ist sehr vorsichtig, um eine Reihenfolge für die Wiedergabe von allem zu definieren. Arrays von Vertex-Daten werden der Reihe nach verarbeitet, was zur Erzeugung von Primitiven in einer bestimmten Reihenfolge führt. Es wird gesagt, dass jedes Grundelement der Reihe nach gerastert ist, und spätere Grundelemente können nicht gerastert werden, bis vorherige beendet sind.

Natürlich ist dies alles, was OpenGL sagt, sollte es sich verhalten. Implementierungen können (und tun) schummeln, indem sie mehrere Primitive gleichzeitig rastern und verarbeiten. Jedoch, sie werden immer noch die "als ob" Regel befolgen. Sie cheaten also intern, aber schreiben immer noch die Ergebnisse , als ob alles sequenziell ausgeführt hätte.

Also ja, es gibt eine bestimmte Reihenfolge, auf die Sie sich verlassen können. Es sei denn, Sie verwenden Shader, die perform incoherent memory accesses; dann sind alle Wetten für Shader-Schreibvorgänge deaktiviert.

1

Obwohl sie tatsächlich in einer anderen Reihenfolge gezeichnet werden und zu verschiedenen Zeiten abgeschlossen werden können, wird in der letzten Rasteroperationspipeline jede Mischung (oder Tiefen-/Schablonen-/Alpha-Test) in der Reihenfolge durchgeführt die Dreiecke wurden ausgegeben.

Sie können dies bestätigen, indem Sie einige Objekt-Rendering eine Mischung Gleichung, die zum Beispiel nicht pendeln,:

glBlendFunc(GL_ONE, GL_DST_COLOR); 

Wenn die endgültigen Bildpuffer durch die gleiche beliebiger Reihenfolge geschrieben wurden, dass die Primitiven gezeichnet werden können, Dann würdest du in einem solchen Beispiel einen Effekt sehen, der dem Z-Kämpfen ähnelt.

Dies ist, warum es einen Fragment-Shader genannt wird (im Gegensatz zum Pixel-Shader), weil es noch kein Pixel ist, da es nach der Fragment-Phase noch nicht in den Framebuffer geschrieben wird; nur nach der Rasteroperationsphase.

Verwandte Themen