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

Aktuelle Zeit: So Jul 20, 2025 22:03

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



Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Nov 20, 2007 11:41 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 12:33 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
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.

_________________
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  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 12:37 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 12:54 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
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...

_________________
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  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 13:02 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 13:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 14:26 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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).

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 15:04 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 18:13 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di Nov 20, 2007 21:44 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
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


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]