Sie sprechen von vier verschiedene Dinge hier: machen Textur (RTT), mehrere Ziele machen (MRTs), die feste Funktion Pipeline (Rendering ohne Shadern) und unmittelbaren Modus Geometrie-Spezifikation (glBegin/glEnd) .
Diese Funktionen sind in OpenGL unabhängig voneinander. Ein Framebuffer in OpenGL kann im Allgemeinen aus Null, einem oder mehreren Farbpuffern bestehen. Und das gilt nicht nur für FBOs, sondern auch für den vom Windows-System bereitgestellten Framebuffer (FBO 0): Im typischen Fall hat dieser 2 Farbpuffer GL_BACK
und GL_FRONT
. Es gibt wahrscheinlich keinen wirklichen Anwendungsfall, um MRT für das gleichzeitige Rendern in den vorderen und hinteren Puffer einzurichten, aber es ist trotzdem möglich. Wenn Sie jedoch eine Implementierung haben, die Streuscopic Pixelformate unterstützt, haben Sie die 4 Farbpuffer GL_FRONT_LEFT
, GL_FRONT_RIGHT
, GL_BACK_LEFT
und GL_BACK_RIGHT
(daher der Name "Quad-Pufferung"), und Rendern nach links und rechts über MRT kann tatsächlich sein nützlich in bestimmten Situationen.
Die Ausgabequalifizierer layout (location=x)
des Fragment-Shaders tun nicht Karte zu GL_COLOR_ATTACHMENTx
. Stattdessen gibt es eine andere Ebene der Indirektion, die explizit durch den Befehl glDrawBuffers()
festgelegt wird, der den tatsächlichen Zielfarbpuffer/Attachment für jeden der Farbindizes definiert. Und Ihr Shader kann auf jede (Unter) Menge der verfügbaren Indizes schreiben.
Wenn Sie keinen Shader verwenden, wird die Farbe in den Farbindex Null geschrieben, und Sie können dies mit Hilfe der Datei glDrawBuffer()
einem beliebigen Anhang zuordnen. Ohne einen Shader können Sie MRT einfach nicht verwenden. Es wird also nur einen Farbwert geben, der nur in einen Farbanhang eines FBO geschrieben wird. (Dies gilt nicht vollständig für den vom Windows-System bereitgestellten Framebuffer, da es spezielle Werte wie GL_FRONT_AND_BACK
oder gibt, also GL_BACK_LEFT
undGL_BACK_RIGHT
in einem stereoskopischen Kontext, so dass Sie manchmal in mehr als einen Farbpuffer ohne MRT schreiben können, aber das repliziert den gleichen Wert auf verschiedene Puffer).
Schließlich hat der unmittelbare Modus nichts mit irgendwelchen davon zu tun. Wenn Sie Ihre Primitive mit glBegin()/glEnd()
oder mit Vertex-Arrays (clientseitig oder VAOs) angeben, oder das attributlose Rendern verwenden und diese irgendwie direkt in den Shadern erzeugen, ist das völlig irrelevant. Alles, was zählt, ist, was DrawBuffer (s) zum Zeitpunkt des Zeichenaufrufs eingerichtet haben.
Ich hoffe, dass Sie wissen, dass der sofortige Modus, sowie die feste-Funktion-Pipeline, seit fast einem Jahrzehnt vollständig veraltet sind. Moderne Kernprofile von OpenGL unterstützen diese Funktionalität nicht mehr.
Scheint abgeschnitten am Ende dort. – genpfault
@genpfault: thnx, um das zu sehen, das war ein Rest von einem Satz, den ich umformuliert habe und vergessen habe zu löschen. – derhass