DGL
https://delphigl.com/forum/

Deaktivieren des Shaders zerhaut mit das Bild
https://delphigl.com/forum/viewtopic.php?f=20&t=7072
Seite 1 von 1

Autor:  pfefferkeks [ Di Nov 20, 2007 11:41 ]
Betreff des Beitrags:  Deaktivieren des Shaders zerhaut mit das Bild

Hi,

nach dem Problem das ich mit den FBO habe (http://www.delphigl.com/forum/viewtopic.php?t=7070), habe ich mich heute Nacht mal an einen einfachn p-Buffer gemacht. Dabei ist mir aufgefallen das dass Bild scheinbar sauber gerendert wird bist zu dem Augenblick wo ich "glUseProgram(NULL);" aufrufe.

Der Coder:
Code:
  1.  
  2.     int uniformLocation0 = -1;
  3.     int uniformLocation1 = -1;
  4.  
  5.     // Set uniform variablen
  6.     uniformLocation0 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex1");
  7.     if(-1 == uniformLocation0) {
  8.         std::cout << "Can't find tmpTex1 in Pass0" << std::endl;
  9.     }
  10.     glActiveTextureARB(GL_TEXTURE0);
  11.     glBindTexture(GL_TEXTURE_2D, tmpTex1);
  12.     glUniform1iARB(uniformLocation0, 0);
  13.  
  14.     uniformLocation1 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex2");
  15.     if(-1 == uniformLocation1) {
  16.         std::cout << "Can't find tmpTex2 in Pass0" << std::endl;
  17.     }
  18.     glActiveTextureARB(GL_TEXTURE1);
  19.     glBindTexture(GL_TEXTURE_2D, tmpTex2);
  20.     glUniform1iARB(uniformLocation1, 1);
  21.  
  22.     // Use shader
  23.     glUseProgram(shaderProgramHandlePass0);
  24.  
  25.     glClearColor(0.0f, 0.0f, 0.3f, 1.0f);
  26.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  27.     glMatrixMode(GL_MODELVIEW);
  28.     glViewport(0, 0, 1024, 1024);
  29.  
  30.     glBegin(GL_QUADS);
  31.         //glEnable(GL_TEXTURE_2D);
  32.             glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
  33.             glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
  34.             glVertex2f(-1.7f, -1.7f);
  35.            
  36.             glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
  37.             glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0);
  38.             glVertex2f(-1.7f, 1.7f);
  39.  
  40.             glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
  41.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0);
  42.             glVertex2f(1.7f, 1.7f);
  43.  
  44.             glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
  45.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
  46.             glVertex2f(1.7f, -1.7f);
  47.         //glDisable(GL_TEXTURE_2D);
  48.     glEnd();
  49.  
  50.     //-----------------------------------------
  51.  
  52.     //glUseProgram(NULL);
  53.  


Wenn ich den Code so ausfuehre wie er oben angezeigt wird werden mir meine Beiden Texturen im Shader gemischt und dann gemischt angezeit.
Wenn ich nunr "glUseProgram(NULL);" einkommentiere sehe ich nur noch die erste Textur auf dem Wuerfel. Zu testzwecken hatte ich auch den Buffer mal in eine Texture geschrieben und gesichert.

Woran kann das liegen? Muss ich mir eine Shader schreiben der eine Fix-Functionallety implementiert nur um die Shader wieder zu deaktivieren?

Danke,
pfefferkeks

Autor:  damadmax [ Di Nov 20, 2007 12:33 ]
Betreff des Beitrags: 

Was hat denn NULL für einen Wert?
Ich weiss jetzt nicht ob es einen Unterschied zu c++ gibt. In Delphi übergebe ich einfach eine '0' an glUseProgramm.

Autor:  pfefferkeks [ Di Nov 20, 2007 12:37 ]
Betreff des Beitrags: 

Hi,

habe es eben mal mit 0 versucht, das gleiche Problem.

Darauf hin habe ich mal nachgeschaut, NULL ist ein #define NULL 0.
Also 0 ;-)

Gruesse,
pfefferkeks

Autor:  damadmax [ Di Nov 20, 2007 12:54 ]
Betreff des Beitrags: 

Mh ok.

ich hab nochmal nachgesehen. bei mir lautet der aufruf glUseProgramObjectARB. liegt da evtl ein unterschied? aber das mag auch ein unterschied in der dglopengl.pas sein. du nutzt ja sicher was anderes...

Autor:  pfefferkeks [ Di Nov 20, 2007 13:02 ]
Betreff des Beitrags: 

Hi,

wenn ich das richtig verstanden habe dann kommen die Aufrufe vom Treiber, was mich aber nicht daran gehindert hat es mal zu versuche.
Leider hat es das Problem nicht behoben, sonder sieht noch genauso aus.

Gruesse

Autor:  Lossy eX [ Di Nov 20, 2007 13:28 ]
Betreff des Beitrags: 

Also es gibt keinen Unterschied zwischen Delphi und C++. Das darf es nicht geben sonst wäre irgendwas ganz gehörig falsch. Denn wie pfefferkeks ja gesagt hat. Die Methodenpointer kommen vom Treiber. Der Name spielt spielt primär keine großartige Rolle, da es sich dabei lediglich um eine Variable handelt. Und die kann so benannt werden wie an möchte. Allerdings heißen die Variablen eigentlich immer so wie die Methoden heißen also wie sie abgefragt werden.

Und in dem Fall gibt einen Unterschied zwischen glUseProgramObjectARB und glUseProgram. Die glUseProgram stammt aus dem 2.0er Kern wärend die glUseProgramObjectARB aus der ARB Erweiterung stammen. Normal werden die Erweiterungen häufig ohne weiteres in den Kern übernommen aber bei den Shadern hat sich ein bisschen was verändert. Entsprechend der Name und noch ein paar kleinere Sachen.

Das ARB am Ende einer Konstante oder Methode verrät, dass es sich dabei um eine Methode/Konstante aus einer Erweiterung handelt. Genau so wie NV, ATI, SGIS, SGIX, etc etc. NUR die Komponenten des Kerns haben keinen Zusatz. So viel zur Namensgebung von OpenGL.

pfefferkeks: Verändert das glUseProgram(NULL) den nachfolgenden Code oder verändert es noch das Zeichnen in deinen Offscreen Buffer? Oder was wird dabei verändert? Bei deaktiviertem Shader müssen natürlich alle TMUs sinnvoll aktiviert worden sein, wenn du sie auch sehen willst. Bzw solltest du auch die TMU0 aktivieren. Denn die Letzte in deinem Code ist die TMU1.

Aber du kannst ja zu testzwecken mal ein glFinish vor dem glUseProgram aufrufen. OpenGL arbeitet Asynchron. Allerdings sollten die Befehle sich da nicht durcheinander bringen lassen. Du hattest ja gestern auch mit dem anderen Probleme. Hast du einen aktuellen Treiber drauf und was ist das denn für eine Karte. Denn irgendwie ist das Mysteriös.

PS: Auf OpenGL Fehler prüfst du ja, oder?

Autor:  pfefferkeks [ Di Nov 20, 2007 14:26 ]
Betreff des Beitrags: 

Hi,

Losst eX, das mit den OpenGL Fehlern war ne Top Sache. Ich habe sie zwar geprueft aber noch nicht in der Methode :-).

Dadurch hat sich herausgestellt das beim Aufruf von "glUniform1iARB()" der Fehler 1282 auftriett. Habe im code an die Stelle mit den fehlern ein "------>" gemacht. Immer die Errorabfrage danach greift.
Fehler 1282 besagt: GL_INVALID_OPERATION
Das heist doch eigentlich ich mach an der stelle was was ich nicht darf. Nur wieso? Warum darf ich das da nicht?
Code:
  1.  
  2.         // Set uniform variablen
  3.     uniformLocation0 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex1");
  4.     if(-1 == uniformLocation0) {
  5.         std::cout << "Can't find tmpTex1 in Pass0" << std::endl;
  6.     }
  7.     printError("after glGetUniformLocationARB");
  8.    
  9.     glActiveTextureARB(GL_TEXTURE0);
  10.     printError("after glActiveTextureARB(GL_TEXTURE0)");
  11.    
  12.     glBindTexture(GL_TEXTURE_2D, tmpTex1);
  13.     printError("after glBindTexture(GL_TEXTURE_2D, tmpTex1);");
  14.    
  15. ------> glUniform1iARB(uniformLocation0, 0);
  16.     printError("after uniformLocation0");
  17.  
  18.     uniformLocation1 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex2");
  19.     if(-1 == uniformLocation1) {
  20.         std::cout << "Can't find tmpTex2 in Pass0" << std::endl;
  21.     }
  22.     printError("after glGetUniformLocationARB");
  23.  
  24.     glActiveTextureARB(GL_TEXTURE1);
  25.     printError("after glActiveTextureARB(GL_TEXTURE1);");
  26.    
  27.     glBindTexture(GL_TEXTURE_2D, tmpTex2);
  28.     printError("after glBindTexture(GL_TEXTURE_2D, tmpTex2);");
  29.  
  30. ------> glUniform1iARB(uniformLocation1, 1);
  31.     printError("after uniformLocation1");
  32.  
  33.     // Use shader
  34.     glUseProgramObjectARB(shaderProgramHandlePass0);
  35.     printError("after load shader pass0");
  36.  
  37.  


Das ganze laeuft auf einer ATI FireGL T2. Neuste Treiber von der ATI Homepage (AMD).


Gruesse

Autor:  Sascha Willems [ Di Nov 20, 2007 14:50 ]
Betreff des Beitrags: 

Du musst den Shader aktivieren bevor du irgendwelche Parameter setzt. Ohne einen aktiven Shader erzeugt dass Setzen eines Uniforms den von dir genannten Fehlercode (siehe u.a. auch offizielle Befehlsübersicht ui glUniform).

Autor:  pfefferkeks [ Di Nov 20, 2007 15:04 ]
Betreff des Beitrags: 

Hi,

danke fuer die Antwort, wenn "aktivieren" heist mach "glUseProgram(shaderProgramHandlePass0);" bevor du die Texture (Uniform Varaiblen) setzt dann lag es daran leider nicht. Habe "glUseProgram" jetzt vor dem holen der Uniform Position. Leider immer noch der gleiche Fehler.

Habe auch mal geschat was der Fehler sonst noch heissen kann:

GL_INVALID_OPERATION is generated if there is no current program object:
Denke ich kann ich ausschliessen da glUseProgram ja ohne fehler durchlaeuft.

GL_INVALID_OPERATION is generated if the type and size of the uniform variable declared in the shader does not match the type and size indicated by the glUniformARB command.
im Shader habe ich eine "sampler2D" Varaible und uebergeben tut ich eine "GL_TEXTURE_2D", also sollte auch passen

GL_INVALID_OPERATION is generated if location is an invalid uniform location for the current program object.
Wie man das abfragen kann weiss ich leider nicht, ich weiss nur das "glGetUniformLocationARB()" kein Fehler bringt.

GL_INVALID_OPERATION is generated if a sampler is loaded using a command other than glUniform1iARB and glUniform1ivARB.
Kann ich wohl auch ausschliessen da ich ja "glUniform1iARB" und testweisse auch "glUniform1i"verwende.

GL_INVALID_OPERATION is generated if glUniformARB is executed between the execution of glBegin and the corresponding execution of glEnd.
Das kann ich mitsicherheit sagen, das ich dass nicht zwischen einem glBegin und glEnd versuche.

Jemand eine Idee was es sein kann?

Habe die display Methode noch mal komplett hier dazu gelegt:
Code:
  1.  
  2.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  3.     glClearColor(0.0, 0.0, 0.0, 1.0);
  4.     glMatrixMode(GL_MODELVIEW);
  5.     glViewport(0, 0, 1024, 768);
  6.     glLoadIdentity();
  7.  
  8.     // Betrachter
  9.     // Blick
  10.     // Y-Achse oben
  11.     gluLookAt( 0.0, 0.0, 3.0,
  12.                0.0, 0.0, 0.0,
  13.                0.0, 1.0, 0.0 );
  14.  
  15.     int uniformLocation0 = -1;
  16.     int uniformLocation1 = -1;
  17.  
  18.     // Use shader
  19.     glUseProgram(shaderProgramHandlePass0);
  20.  
  21.     // Set uniform variablen
  22.     uniformLocation0 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex1");
  23.     if(-1 == uniformLocation0) {
  24.         std::cout << "Can't find tmpTex1 in Pass0" << std::endl;
  25.     }
  26.    
  27.     glActiveTextureARB(GL_TEXTURE0);
  28.     glBindTexture(GL_TEXTURE_2D, tmpTex1);
  29.     glUniform1iARB(uniformLocation0, 0);
  30.  
  31.     uniformLocation1 = glGetUniformLocationARB(shaderProgramHandlePass0, "tmpTex2");
  32.     if(-1 == uniformLocation1) {
  33.         std::cout << "Can't find tmpTex2 in Pass0" << std::endl;
  34.     }
  35.     glActiveTextureARB(GL_TEXTURE1);
  36.     glBindTexture(GL_TEXTURE_2D, tmpTex2);
  37.     glUniform1iARB(uniformLocation1, 1);
  38.  
  39.     glBegin(GL_QUADS);
  40.         //glEnable(GL_TEXTURE_2D);
  41.             glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
  42.             glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
  43.             glVertex2f(-1.7f, -1.7f);
  44.            
  45.             glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
  46.             glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0);
  47.             glVertex2f(-1.7f, 1.7f);
  48.  
  49.             glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
  50.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0);
  51.             glVertex2f(1.7f, 1.7f);
  52.  
  53.             glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
  54.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
  55.             glVertex2f(1.7f, -1.7f);
  56.         //glDisable(GL_TEXTURE_2D);
  57.     glEnd();
  58.    
  59.     glFlush();
  60.     glutSwapBuffers();
  61.     glutPostRedisplay();
  62.  


Danke

Autor:  Sascha Willems [ Di Nov 20, 2007 18:13 ]
Betreff des Beitrags: 

Ich hab ganz oben gelesen dass du einen "P-Buffer" bentutzt. Meinst du damit ein Pixelbufferoject? Wenn ja, dort muss man beachten dass dieses ja einen eigenen Kontext und auch Namensraum hat, den man (unter Windows) mit wglShareLists mit dem Kontext teilen muss, in dem die Shader erstellt wurden. Tust du das auch? Ansonsten sieht der Quellcode denn du da gepostet hast korrekt aus, evtl. solltest du dann mal einen OpenGL-Debugger (z.B. glDEbugger) probieren.

Autor:  pfefferkeks [ Di Nov 20, 2007 21:44 ]
Betreff des Beitrags: 

Problem gefunden!

Danke fuer eure Hilfe.

Das Problem war das ich meinem Header zu der Klasse die Varaiblen fuer die Texturen nicht mit GLuint sonder als unsigned int dekleriert habe.

Jetzt waere es interessant den Unterschied zu wissen. ;-)

Gruesse,
pfefferkeks

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/