2013-07-23 9 views
7

Ich gehe davon aus, dass dies eines der Dinge sein wird, die "undefined" ist, aber ich kann nicht scheinen, eine konkrete Antwort von Google zu finden.OpenGL-Standardwert für ungepufferte Vertex-Attribut bei Verwendung von Layoutqualifikatoren

Lasst uns in meinem Vertex-Shader sagen, ich habe:

layout(location = 0) in vec3 vPosition; 
layout(location = 1) in vec3 vNormal; 
layout(location = 2) in vec4 vColour; 

Aber es gibt nichts zu Lage gepuffert 2 mit glEnableVertexAttribArray() oder glVertexAttribPointer(). Kann ich erwarten, dass der Wert etwas Besonderes ist?

Ich nahm für eine vec4 an, dass es entlang der Linien {0,0,0,0}, {0,0,0,1} oder {1,1,1,1}, aber in mein Fall ist es {0,0,1,1}.

Als ich zuvor glBindAttribLocation() verwendet habe, um die Speicherorte anzugeben, wurde standardmäßig {1,1,1,1} auf vier verschiedenen Computern mit drei verschiedenen Betriebssystemen (ubuntu 12.04, Windows 7 und ubuntu 10.04) verwendet.

Ist es sicher anzunehmen, dass der Wert {0,0,1,1} auf allen Maschinen liegt? oder war das einfach Zufall?

Antwort

5

Kann ich erwarten, dass der Wert etwas Besonderes ist?

Ja, es ist ein bestimmter Wert.

Unter der Annahme, dass Sie richtig das Attribut Array ausgeschaltet (dh: mit glDisableVertexAttribArray auf diesem Attribut-Index), der Wert aus den in-context vertex attribute bekommen kommt, wie sie durch die glVertexAttrib Suite von Funktionen. Dies sind globale Kontextzustände, die nicht im VAO gespeichert sind.

Standardmäßig beginnen alle bei (0, 0, 0, 1). Wenn Sie jedoch mit einem bestimmten Attribut mit einem Array in diesem Attributindex gerendert haben, wird der Kontextwert effektiv zerstört. Daher sollten Sie den Kontextwert zurücksetzen, wenn Sie ihn verwenden möchten.

+0

Also habe ich glDisableVertexAttribArray() für die bestimmte Ortsnummer gesetzt, aber es wird immer noch im Shader als {0,0,1,1} gelesen. Ich benutze einen VAO, also mache ich den Anruf nur einmal. Sollte ich sie direkt deaktivieren bevor ich meinen glDrawElements() Aufruf statt? – kbirk

+0

@Pondwater: Wenn der VAO es deaktiviert, ist es deaktiviert. Sie müssen es nicht erneut deaktivieren. Außerdem habe ich einen Nachtrag zu der Antwort gemacht. –

+0

Ahh das macht Sinn! Danke für die Abklärung! – kbirk

1

Sie sind hier undefiniert, aber das ist kein Problem. Dort besteht der GL-Zustand aus den Werten CURRENT_VERTEX_ATTRIB. Anfangs sind sie (0,0,0,1). Sie können die Attributwerte für diese Attribute explizit festlegen, wenn über die Funktionsfamilie glVertexAttrib() kein Array aktiviert ist.

Die einzige Sorge ist, was mit den aktuellen Werten passiert, wenn das Attribut-Array während des Zeichnens tatsächlich aktiviert ist. Zitieren die Spec (Version 3.3), Abschnitt 2.8.3 Vertex Arrays - Zeichnung Befehl:

Wenn ein Array auf ein allgemeines Attribut entspricht, die von einem Vertex-Shader erforderlich nicht aktiviert ist, dann wird das entsprechende Element aus dem aktuellen generic genommen Attributstatus (siehe Abschnitt 2.7).

Wenn ein Array zu einem Generic Attribute entspricht, die durch einen Vertex-Shader erforderlich aktiviert ist, wird der entsprechende Strom generische Attributwert nach der Ausführung von DrawArraysOneInstance undefiniert.

Also müssen Sie nur einen nützlichen Wert angeben, nachdem Sie mit einem für dieses bestimmte Attribut aktivierten Array gezeichnet haben.

UPDATE

hat mit OpenGL 4.2 tatsächlich Anfang dieses Verhalten geändert:

Wenn ein Array zu einem Generic Attribute entspricht, die durch einen Vertex-Shader erforderlich ist nicht aktiviert ist, dann wird das entsprechende Element aufgenommen wird, aus dem aktuellen generischen Attribut Zustand (siehe Abschnitt 2.7). Andernfalls, wenn ein Array aktiviert ist, ist der entsprechende aktuelle generische Attributwert nicht betroffen durch die Ausführung von DrawArraysOneInstance.

So wird jetzt ein glDraw*() Aufruf nie die aktuell festgelegten Attributwerte ändern.

+0

"* Sie sind hier undefiniert, aber das ist kein Problem. Der GL-Status besteht aus den CURRENT_VERTEX_ATTRIB-Werten. *" Wie macht sie das also "undefiniert"? Es ist nicht undefiniert, wenn die Spezifikation * sie definiert. –

+1

@NicolBolas: Ich habe Bezug genommen auf die Tatsache, dass die Werte undefiniert sind, nachdem Sie mit dem Attribut-Array aktiviert (wie von der Spezifikation), die ich der OP tat, da sie sonst auf die Standardwerte gewesen wäre, wenn er weiß nicht einmal über 'glVertexAttrib'. – derhass