2016-09-29 1 views
1

Ich habe ein Problem bei der Validierung meines Shader-Programms in LWJGL/OpenGL 3.
Ich lese die Dokumentation, aber ich kann keinen Grund finden, warum ein VAO beim Aufruf von glValidateProgram benötigt wird.Warum schlägt glValidateProgram fehl, wenn kein VAO gebunden ist?

int program = glCreateProgram(); 
int vertexShader = glCreateShader(...); 
int fragmentShader = glCreateShader(...); 
// ... vertex and fragment shader loading, compiling, errorchecking ... 
glAttachShader(program, vertexShader); 
glAttachShader(program, fragmentShader); 
glBindAttribLocation(program, 0, "position"); 
glBindAttribLocation(program, 1, "color"); 
glLinkProgram(program); 
glDetachShader(program, shader); 
glDetachShader(program, shader); 
glValidateProgram(program); 
if (glGetProgrami(program, GL_VALIDATE_STATUS) != GL_TRUE) 
    System.exit(-1); 

Das Programm wird ohne Fehlermeldung beendet.
GL_LINK_STATUS ist OK und GL.getErrors() hat auch nichts zu berichten.
Aber beim Erstellen eines VAO um glValidateProgram funktioniert es gut.
Ich kann auch einfach ignorieren, dass glGetProgrami GL_FALSE zurückgibt und nur das Shader-Programm ausführt.

Was ich meine, mit einer VAO um glValidateProgram zu schaffen():

int vao = glGenVertexArrays(); 
glBindVertexArray(vao); 
glValidateProgram(program); 
if (glGetProgrami(program, GL_VALIDATE_STATUS) != GL_TRUE) 
    System.exit(-1); 
glDeleteVertexArrays(vao); 

Wenn ich das tue, GL_VALIDATE_STATUS wahr ist, und ich kann meine Sachen ziehen.

Die verwendeten Shader sind einfache Passthrough-Shader.
Der Vertex-Shader gibt die Position zurück und der Fragment-Shader gibt die Farbe zurück.

Also, warum muss ich ein VAO binden, obwohl ich es sofort nach der Validierung löschen kann?

Antwort

2

Dieses Verhalten entspricht der OpenGL-Spezifikation. Ich verwende die OpenGL 3.3 Spezifikation als Referenz.

In Anhang E.2.2 "Entfernen Funktionen" auf Seite 344, heißt es:

Der Standard Vertex-Array-Objekt (der Name Null) ist ebenfalls veraltet. Wenn VertexAttribPointer aufgerufen wird, wenn kein Pufferobjekt oder kein Vertex-Array-Objekt gebunden ist, wird ein INVALID_OPERATION-Fehler generiert, ebenso wie der Aufruf eines Array-Zeichenbefehls, wenn kein Vertex-Array-Objekt gebunden ist.

Die Spezifikation für glValidateProgram() auf Seite 82 sagt:

ValidateProgram für alle Bedingungen überprüfen wird, die zu einem INVALID_OPERATION Fehler führen könnten beim Rendern Befehle ausgegeben werden, und kann für andere Bedingungen als auch überprüfen.

So weil ein Unentschieden Befehl ohne VAO gebunden Willen gegeben einen GL_INVALID_OPERATION Fehler und glValidateProgram() prüft, ob ein Zeichenbefehl würde einen GL_INVALID_OPERATION Fehler geben, was Sie sehen, genau wie erwartet ist.

+0

Danke. Da die Objekte, die das Programm zeichnet, während der Erstellung des Shaders unbekannt sind, das heißt, ich habe keine Vaos zum Binden, muss ich fragen, ob das Erstellen eines Vaos nur für den Validierungsprozess des Shader-Programms eine gültige Möglichkeit ist, dies zu verhindern Fehler, oder missverstand ich etwas über die Verbindung zwischen Vaos und Shadern und die Erstellung eines temporären Vao ist ein Hinweis darauf, dass die Struktur meines Rendering-Code fehlerhaft ist? – iHaveNoIdeaWhatImDoing

+1

@iHaveNoIdeaWhatImDoing: zu meinem Verständnis müssen Sie 'glValidateProgram' für alles andere als eine Debug-Hilfe verwenden. Überprüfen Sie den 'GL_LINK_STATUS', um den Fehler zur Kompilierungszeit zu überprüfen. – ybungalobill

+0

@iHaveNoIdeaWhatImDoing: Der Zweck von 'glValidateProgram' besteht darin, zu überprüfen, ob alles vorhanden ist, um ein bestimmtes Programm zu verwenden. Der Name ist ein bisschen unglücklich, weil er das Programm nicht wirklich validiert, sondern dass die Ausführungsumgebung (d. H. Der Zustand des OpenGL-Kontexts) den Anforderungen des Programms entspricht. – datenwolf

Verwandte Themen