Den Fehler "Der Vorgang ist ungültig" gemeldet. Texture1 ist im Fragment Shader so definiert:
Code:
uniform sampler2D Texture1;
Entsprechend bleibt Textur 1 im Shader Textur 0 - es wird also für beide Texturen Textur 0 verwendet. Ansonsten tritt kein Fehler auf. Textur 1 wir im Shader geladen und im Renderergebnis dargestellt. Ohne Shader werden beide Texturen multipliziert.
Woher bekommst du "Der Vorgang ist ungültig" gemeldet? OpenGL meldet von dem Debug Output in OpenGL 4 mal abgesehen, von selbst nämlich erstmal gar nichts. Um herauszufinden ob überhaupt ein Fehler aufgetreten ist, musst man ja schließlich "glGetError" aufrufen.
Hast du den Shader überhaupt gebunden, in dem du die Uniformvariable hast? Die alten "glUniform"-Funktionen funktionieren nur dann, wenn das Shader Programm vorher gebunden wurde.
Du solltest außer in Ausnahmefällen besser die OpenGL-Core-Funktionen keine Extensionen wenn nicht unbedingt notwendig. Es kann auch Fehler geben, wenn "normale" OpenGL Funktionen und Extensionfunktionen für den selben Zweck gemischt aufgerufen werden.
Aus Performancegründen und wegen dem besseren Debugging solltest du die Uniform-Location die dir "glGetUniformLocation" zurück gibt, direkt bei der Shader Programm ID cachen und nicht jedes mal neu anfragen.
Der Shader ist gebunden (Dass ich die Helligkeit der Textur 0 über einen Faktor im Shader einstellen kann sollte Beweis genug sein). Direkt nach dem genannten Aufruf kommt
Code:
glUseProgram(ProgramObject);
und danach wird gezeichnet.
Den Fehler lasse ich mir mit
Code:
gluErrorString(glGetError())
ausgeben. Ist die genannte Zeile auskommentiert, dann tritt kein Fehler aus.
Auch mit den Core Funktionen läuft es nicht. Das ARB habe ich erst einmal aus dem Tutorial übernommen.
Sicherlich lässt sich da noch einiges optimieren - erst einmal sollte es aber laufen.
. Direkt nach dem genannten Aufruf kommt glUseProgram [...]
Meinst du mit genannten Aufruf "glUniform1"? Wenn ja, dann machst du es wie ich schon sagte genau falsch herum. "glUniform1" wird erst funktionieren wenn du zuvor den Shader bindest.
Wenn es das nicht ist, kann ich dir nur noch raten, in der Spezifikation die möglichen Ursachen für den Fehler nochmal genau durch zu gehen:
Zitat:
GL_INVALID_OPERATION is generated if there is no current program object. GL_INVALID_OPERATION is generated if the size of the uniform variable declared in the shader does not match the size indicated by the glUniform command. GL_INVALID_OPERATION is generated if one of the signed or unsigned integer variants of this function is used to load a uniform variable of type float, vec2, vec3, vec4, or an array of these, or if one of the floating-point variants of this function is used to load a uniform variable of type int, ivec2, ivec3, ivec4, unsigned int, uvec2, uvec3, uvec4, or an array of these. GL_INVALID_OPERATION is generated if one of the signed integer variants of this function is used to load a uniform variable of type unsigned int, uvec2, uvec3, uvec4, or an array of these. GL_INVALID_OPERATION is generated if one of the unsigned integer variants of this function is used to load a uniform variable of type int, ivec2, ivec3, ivec4, or an array of these. GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object and location is not equal to -1. GL_INVALID_VALUE is generated if count is less than 0. GL_INVALID_OPERATION is generated if count is greater than 1 and the indicated uniform variable is not an array variable. GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than glUniform1i and glUniform1iv.
Registriert: Sa Aug 18, 2007 18:47 Beiträge: 694 Wohnort: Köln
Programmiersprache: Java
Noch was zur Performance:
Wenn du die Uniformlocations in einem Cache speicherst musst du sie dir erneut cachen, wenn du den Shader neu linkst (glLinkProgram). Anders herum, beim Linken werden sie neu vergeben. Das braucht man normalerweise nicht, weil die Shader häufig gleich bleiben und auch die Reihenfolge/Anzahl identisch ist. Sobald es aber etwas dynamisch wird und Shader z.B. mit Kompilerdirektiven erzeugt werden, kann das schonmal in die Hose gehen.
_________________ Es werde Licht. glEnable(GL_LIGHTING); Und es ward Licht.
Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"
Mitglieder in diesem Forum: 0 Mitglieder und 70 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.