- glValidateProgramARB(SlangProg);
- glGetObjectParameterivARB(SlangProg,GL_OBJECT_VALIDATE_STATUS_ARB,@Validate);
DGL https://delphigl.com/forum/ |
|
glUseProgramObjectARB und GL_INVALID_OPERATION https://delphigl.com/forum/viewtopic.php?f=20&t=4283 |
Seite 1 von 1 |
Autor: | Blechwolf [ Mo Jun 20, 2005 09:54 ] |
Betreff des Beitrags: | glUseProgramObjectARB und GL_INVALID_OPERATION |
Salut, ich habe das Problem, das mein Proggi beim Aufruf von glUseProgramObjectARB eine GL_INVALID_OPERATION wirft. Ein Blick ins WIKI zeigt mir folgende Möglichkeiten: Zitat: GL_INVALID_OPERATION wird generierrt wenn programObj nicht vom Typ GL_PROGRAM_OBJECT_ARB ist.
GL_INVALID_OPERATION wird generiert wenn das Programm nicht installiert werden konnte. GL_INVALID_OPERATION wird generiert wenn glUseProgramObjectARB zwischen einem glBegin und dem zugehörigen glEnd aufgerufen wird. Die letzte Möglichkeit kann ich definitiv ausschliessen. Die beiden anderen nicht zu 100%. Eigentlich sollte dann ja das folgende nicht passieren: Ein Aufruf von Code:
gibt mir aber in der Variable Validate eine 1 zurück. (1 = TRUE = Valid) und das GLSL InfoLog ist auch leer. Der Shader wird ordnungsgemäß gelinkt (zumindest ohne Fehlermeldung). Auch mit glIsValidate von 3DLabs meldet er keine Probleme. Kann ich irgendwie rausbekommen, warum der sowas macht? So sieht es aus wenn ich den Shader erzeuge: Code:
Hier wird er aufgerufen und mit Variablen gefüttert: Code:
Und das sind die zwei Shader: Vertex Shader: (GLSL_VERT_COORDINATE) Code:
Fragment Shader (GLSL_FRAG_SHADERMAP) Code:
Lustigerweise funktioniert es ohne Probleme, wenn ich den folgenden Fragment-Shader nehme: Code:
Init-Teil habe ich einfach kopiert, eingefügt und lediglich die Namen geändert. Hat jemand ne schöne Idee? |
Autor: | Blechwolf [ Mo Jun 20, 2005 10:49 ] |
Betreff des Beitrags: | |
Ok, hab den Fehler weiter eingeschränkt. Also in der folgenden Prozedur funktioniert es mit beiden Shadern (GLSL_FRAG_SHADERMAP und GLSL_FRAG_COLORMAP) Code:
Der Aufruf glGetHandleARB(GL_PROGRAM_OBJECT_ARB) liefert mir erwartungsgemäss eine 1 zurück. in der folgenden Prozedur funktioniert es nicht (weder mit GLSL_FRAG_COLORMAP noch mit GLSL_FRAG_SHADERMAP) Code:
Hier bekomme ich mit dem gleichen Aufruf eine 0. Obwohl eigentlich nix anders ist. Oder seh ich jetzt den Wald vor lauter Bäumen nicht mehr? |
Autor: | Lossy eX [ Mo Jun 20, 2005 11:15 ] |
Betreff des Beitrags: | |
Hast du schon mal versucht den Fehler häufiger abzufragen? Also das Stück mit glGetError in eine Procedure und dann zwischen jede Zeile. Also so, dass du genau sehen kannst wann der fehler denn genau auftritt. Evtl liegt er ja nur ganz wo anders und wird erst nur dann bemerkt. Ist das Ergebnis was du erhält denn eigentlich korrekt oder wird auch nichts dargestellt? Eine Anmerkung am Rande. Das mit den Texturen kann du auch einfacher haben. GL_TEXTURE_3D und GL_TEXTURE_3D_EXT haben beide ein und den selben Wert. Sind also auch für OpenGL ein und das Selbe. GL_TEXTURE_3D wird seit OpenGL 1.2 im Core unterstützt. Sollte es aber nicht unterstützt werden so setzt du GL_EXT_texture3D stillschweigend vorraus. Ich denke es wäre besser wenn du überprüfst ob OpenGL > 1.2 ist oder ob die Extension unterstützt wird. |
Autor: | Blechwolf [ Mo Jun 20, 2005 11:31 ] |
Betreff des Beitrags: | |
Letztlich mache ich die Fehlerabfrage mit GLIntercept v0.42 und der sagt mir explizit, das der Fehler von glUseProgramObjectARB aufgerufen wird. Ich habe das ganze nochmal ein wenig modifiziert: Das Laden/Linken der Shader steht jetzt in einer eigenen Prozedur Code:
und in meiner OnRender-Routine findet sich jetzt nur noch das glUseProgramObjectARB. Geladen werden die Shader wie vorher in AssignData bzw. AssignColormap. Hier die Render Routine (gekürzt wo möglich) Code:
Mein Ergebnis ist leider falsch, sofern ich FShading einschalte. mit FColorMap ist es korrekt. Aber da bekomme ich auch keine Fehler. |
Autor: | Lossy eX [ Mo Jun 20, 2005 12:20 ] |
Betreff des Beitrags: | |
Also wegen dem glUseProgramObjectARB muss ich passen. Für mich sieht es in Ordnung aus aber ich kenne mich damit auch nicht so super aus. Liefert dir glSlang_GetInfoLog(Shader) eigentlich einen Text, wenn das Benutzen des Shaders nicht geklappt hat? Ich denke aber auch mal, dass glUseProgramObjectARB(SlangProg); nur ein Übertragungsfehler ist. Denn eigentlich sollte das ja bestimmt Shader heißen. 3D Textur: Auch auf die Gefahr hin, dass ich mich unglücklich mache. Anstelle von Code:
kannst du auch vollgendes schreiben. Code:
Und damit könntest du es auch auf glEnable(GL_TEXTURE_3D); beschränken. Das hat den gleichen Effekt, da GL_TEXTURE_3D = GL_TEXTURE_3D_EXT ist. Die beiden Extensions unterscheiden sich lediglich im Namen und der Variable in der ihre Funktionspointer abgelegt werden. Ich würde sogar fast Wetten, dass die Funktionspointer die Gleichen sind. |
Autor: | Blechwolf [ Mo Jun 20, 2005 12:39 ] |
Betreff des Beitrags: | |
Lossy eX hat geschrieben: Und damit könntest du es auch auf glEnable(GL_TEXTURE_3D); beschränken. Das hat den gleichen Effekt, da GL_TEXTURE_3D = GL_TEXTURE_3D_EXT ist. Die beiden Extensions unterscheiden sich lediglich im Namen und der Variable in der ihre Funktionspointer abgelegt werden. Ich würde sogar fast Wetten, dass die Funktionspointer die Gleichen sind.
Im Prinzip hast Du Recht. Nur bevor ich die jetzige Grafikkarte bekommen habe (GF6600) lief das ganze (ok es kroch...) auf nem OnBoard Grafikchipsatz. (Müßte eigentlich Intel SiS gewesen sein. - Weiß schon nicht mehr) Der hat sich mit OpenGL 1.2 kompatibel gemeldet, kannte aber die GL_TEXTURE_3D nicht. Von daher ist die Abfrage da noch drin... Ist leider nicht alles so heile in der OpenGL-Welt wie man sich das manchmal wünschen würde. Noch ein Beispiel? Such mal auf ner ATI 9x00 nach GL_IMAGING-Subset. Gibts auf den Apple Karten, aber für Windows gibts das nicht. Obwohl es seit OpenGL 1.2 eigentlich Standard sein sollte... Habe eben den ganzen Kram gelöscht (zumindest den Shader Teil) und baue das nochmal neu. Vielleicht habe ich ja irgendwo einfach was übersehen. Danke für die Hilfe. |
Autor: | Grizzly [ Mo Jun 20, 2005 15:56 ] |
Betreff des Beitrags: | |
GL_TEXTURE_3D und GL_TEXTURE_3D_EXT sind allerdings 2 constanten, die beide den selben Wert ($806F) haben. Insofern sollte es vollkommen egal sein, welchen der beiden Werte man einsetzt. Entweder die Graka kann 3D texturen, dann ist es egal welchen der beiden man einsetzt, oder sie kann es nicht, dann funktionieren aber beide nicht. Durch den Programmcode wollte ich mich jetzt nich wühlen, hättest du nicht die benötigten Dateien hochladen können, dass man mal testen könnte? so auf den ersten Blick find ich das jedenfalls nicht ersichtlich. |
Autor: | Blechwolf [ Di Jun 21, 2005 11:12 ] |
Betreff des Beitrags: | |
Das Problem hat sich auf wundersame Weise gelöst. Nachdem ich das alles nochmal neu geschrieben habe, funktioniert es jetzt. Warum auch immer. EDV = Ende der Vernunft 3D Textures Hm, ok. Überzeugt. Sind tatsächlich die gleichen Konstanten. Dann brauche ich die Abfrage nur noch bei, Code:
Bedankt. Zu den benötigten Dateien gehören (leider) ein paar Komponenten, ein kleines Framework aussen drum sowie mindestens ein Datensatz. Und allein der ist schon 16MB groß. Sonst gerne die Dateien, aber da das so schlecht zu trennen ist, indem Fall lieber den Quellcode. |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |