Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Apr 23, 2024 11:03

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: glUniform1iARB
BeitragVerfasst: Mo Nov 04, 2013 16:31 
Offline
DGL Member

Registriert: Fr Feb 04, 2011 19:05
Beiträge: 13
Hallo zusammen,

ich bekomme bei der Benutzung der Funktion
Code:
  1.   glUniform1iARB(glGetUniformLocationARB(ProgramObject, 'Texture1'), 1);
Den Fehler "Der Vorgang ist ungültig" gemeldet. Texture1 ist im Fragment Shader so definiert:
Code:
  1. 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.
Code:
  1. glGetUniformLocationARB(ProgramObject, 'Texture1')
gibt einen Wert >0 zurück. Der Fehler Tritt auch mit einer Variable des Typs int (im Shader) auf.

Hat jemand eine Idee, woran der Fehler liegen könnte?

Die Funktion
Code:
  1. glSlang_GetUniLoc()
wie hier angegeben gibt es übrigens nicht mehr!

Zu meiner Umgebung:

IDE: Lazarus 1.0.12 (64 Bit)
Compiler: fpc 2.6.4
DGL: 4.4 (aktuellste Version)
OS: Win 7 HP 64Bit
Graka: Intel GMA 4500MHD (aktuell 160 MB shared RAM; GLSlang: 1.2; Treiber Version 8.15.10.2302 - angeblich die aktuellste)
CPU: Intel Core 2 Duo SU7300

Vielen Dank im Voraus.

MfG

Wuppertaler


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glUniform1iARB
BeitragVerfasst: Mo Nov 04, 2013 17:16 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glUniform1iARB
BeitragVerfasst: Mo Nov 04, 2013 17:27 
Offline
DGL Member

Registriert: Fr Feb 04, 2011 19:05
Beiträge: 13
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:
  1. glUseProgram(ProgramObject);
und danach wird gezeichnet.

Den Fehler lasse ich mir mit
Code:
  1. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glUniform1iARB
BeitragVerfasst: Mo Nov 04, 2013 17:35 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glUniform1iARB
BeitragVerfasst: Mo Nov 04, 2013 19:11 
Offline
DGL Member

Registriert: Fr Feb 04, 2011 19:05
Beiträge: 13
Vielen Dank.

Das war das Problem. Das mit dem Shader Binden hatte ich so verstanden, dass
Code:
  1. glLinkProgram(ProgramObject);
gemeint ist. Das war natürlich vorher schon geschehen.

Btw: Wunderlicherweise ist der Shader ca. 3x so schnell, wie die OpenGL-Funktion.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: glUniform1iARB
BeitragVerfasst: Mo Nov 04, 2013 20:31 
Offline
DGL Member
Benutzeravatar

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"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

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.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 5.181s | 17 Queries | GZIP : On ]