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

Aktuelle Zeit: Mo Jul 21, 2025 09:18

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



Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
BeitragVerfasst: Mo Nov 19, 2007 15:23 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Hallo,

ich versuche nun schon seit ein paar Tagen die zweite Textur in einem Shader zum laufen zu bekommen. Die Anwendung die ich nun habe ist eine reine Testanwendung um herauszufinden was der Fehler ist.

Der Aufbau:
Ich habe zwei Texturen die aus einer Datei geladen werden (Dies funktioniert, werden beide angezeigt wenn ich sie direkt auf einen Würfel render). Nun habe ich ein FBO (fboPass0) das dass Ergebnis von meinem rendern mit den Shadern in der Texture renderResultPass0 ablegt.
Ich übergebe beide Texturen meine Fragmentshader, dort wollte ich sie eigentlich mischen. Aber es kommt nur die erst an. Wenn ich gl_FragColor mit den Werten der ersten Textur setze, sehe ich sie 1 zu 1 auf dem Würfel aufgebracht. Versuche ich das gleiche mit der zweiten Textur. Sehe ich nix.

Vertex Shader:
Code:
  1.  
  2. void main(void) {
  3.    gl_TexCoord[0] = gl_MultiTexCoord0;
  4.    gl_TexCoord[1] = gl_MultiTexCoord1;
  5.    gl_Position = ftransform();
  6. }
  7.  


Fragment Shader:
Code:
  1.  
  2. uniform sampler2D tmpTex1;
  3. uniform sampler2D tmpTex2;
  4.  
  5. void main(void) {
  6.    vec4 tmp1 = texture2D(tmpTex1, gl_TexCoord[0].xy);
  7.    vec4 tmp2 = texture2D(tmpTex2, gl_TexCoord[1].xy);
  8.    vec4 color = clamp(tmp1+tmp2, 0.0, 1.0);
  9.    
  10.    gl_FragColor = tmp1;
  11. }
  12.  


Wenn ich hier tmp1 durch tmp2 ersetze sollte ich Texture 2 normal sehen. Leider ist das nicht der Fall.

und hier nutze ich das ganze:
Code:
  1.  
  2. void ShaderBlurMeanFilter::init(void) {
  3.     // Load texture from file
  4.     loadTexture("TmpTex1.bmp", &tmpTex1);
  5.     loadTexture("TmpTex2.bmp", &tmpTex2);
  6.  
  7.     std::string vertShaderSource;
  8.     std::string fragShaderSource;
  9.  
  10.     const char* tmpVertShaderSource;
  11.     const char* tmpFragShaderSource;
  12.  
  13.     GLint result = -1;
  14.     GLenum status;
  15.  
  16.     /* ****** *
  17.      * Pass 0 *
  18.      * ****** */
  19.     // Init vertex Shader
  20.     vertShaderPass0 = glCreateShader(GL_VERTEX_SHADER);
  21.     vertShaderSource = loadShader("Shader/Pass0.vert");
  22.     tmpVertShaderSource = vertShaderSource.c_str();
  23.     glShaderSource(vertShaderPass0, 1, &tmpVertShaderSource, NULL);
  24.     glCompileShader(vertShaderPass0);
  25.  
  26.     result = -1;
  27.     glGetShaderiv(vertShaderPass0, GL_COMPILE_STATUS, &result);
  28.     if(GL_FALSE == result) {
  29.         GLchar errorMessage[1024];
  30.         glGetShaderInfoLog(vertShaderPass0, 1024, NULL, errorMessage);
  31.         std::cout << "Can't compile vertex shader:" << errorMessage << std::endl;
  32.         exit(-1);
  33.     }
  34.  
  35.     // Init fragment Shader
  36.     fragShaderPass0 = glCreateShader(GL_FRAGMENT_SHADER);
  37.     fragShaderSource = loadShader("Shader/Pass0.frag");
  38.     tmpFragShaderSource = fragShaderSource.c_str();
  39.     glShaderSource(fragShaderPass0, 1, &tmpFragShaderSource, NULL);
  40.     glCompileShader(fragShaderPass0);
  41.  
  42.     result = -1;
  43.     glGetShaderiv(fragShaderPass0, GL_COMPILE_STATUS, &result);
  44.     if(GL_FALSE == result) {
  45.         GLchar errorMessage[1024];
  46.         glGetShaderInfoLog(fragShaderPass0, 1024, NULL, errorMessage);
  47.         std::cout << "Can't compile fragment shader:" << errorMessage << std::endl;
  48.         exit(-1);
  49.     }
  50.  
  51.     // Shader programm
  52.     shaderProgramHandlePass0 = glCreateProgram();
  53.     glAttachShader(shaderProgramHandlePass0, vertShaderPass0);
  54.     glAttachShader(shaderProgramHandlePass0, fragShaderPass0);
  55.     glLinkProgram(shaderProgramHandlePass0);
  56.  
  57.     // FBO
  58.     glGenFramebuffersEXT(1, &fboPass0);
  59.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboPass0);
  60.  
  61.     glGenRenderbuffersEXT(1, &fboDepthBufferPass0);
  62.     glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, fboDepthBufferPass0);
  63.     glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, 1024, 1024);
  64.     glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, fboDepthBufferPass0);
  65.    
  66.     glGenTextures(1, &renderResultPass0);
  67.     glBindTexture(GL_TEXTURE_2D, renderResultPass0);
  68.     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,  1024, 1024, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
  69.     glGenerateMipmapEXT(GL_TEXTURE_2D);
  70.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  71.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
  72.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  73.     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  74.     glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, renderResultPass0, 0);  
  75.  
  76.     status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
  77.     if(GL_FRAMEBUFFER_COMPLETE_EXT != status) {
  78.         std::cout << "FBO Pass0 Error!" << std::endl;
  79.         exit(-1);
  80.     }
  81.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  82. }
  83.  
  84. void ShaderBlurMeanFilter::renderToScreen(void) {
  85.     int unifomrLocation0 = -1;
  86.     int unifomrLocation1 = -1;
  87.  
  88.     // Use FBO
  89.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboPass0);
  90.         glPushAttrib(GL_VIEWPORT_BIT);
  91.         glViewport(0, 0, 1024, 1024);
  92.  
  93.         // Set uniform variablen
  94.         unifomrLocation0 = glGetUniformLocation(shaderProgramHandlePass0, "tmpTex1");
  95.         if(-1 == unifomrLocation0) {
  96.             std::cout << "Can't find tmpTex1 in Pass0" << std::endl;
  97.         }
  98.         glActiveTexture(GL_TEXTURE0);
  99.         glBindTexture(GL_TEXTURE_2D, tmpTex1);
  100.         glUniform1i(unifomrLocation0, 0);
  101.  
  102.         unifomrLocation1 = glGetUniformLocation(shaderProgramHandlePass0, "tmpTex2");
  103.         if(-1 == unifomrLocation1) {
  104.             std::cout << "Can't find tmpTex2 in Pass0" << std::endl;
  105.         }
  106.         glActiveTexture(GL_TEXTURE1);
  107.         glBindTexture(GL_TEXTURE_2D, tmpTex2);
  108.         glUniform1i(unifomrLocation1, 1);
  109.  
  110.         // Use shader
  111.         glUseProgram(shaderProgramHandlePass0);
  112.  
  113.         //Render
  114.         glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
  115.         glBegin(GL_QUADS);
  116.             glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
  117.             glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
  118.             glVertex2f(-1.7f, -1.7f);
  119.            
  120.             glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
  121.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
  122.             glVertex2f(-1.7f, 1.7f);
  123.  
  124.             glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
  125.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0);
  126.             glVertex2f(1.7f, 1.7f);
  127.  
  128.             glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
  129.             glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
  130.             glVertex2f(1.7f, -1.7f);
  131.         glEnd();
  132.  
  133.         glPopAttrib();
  134.     glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
  135.  
  136.     /* **************** *
  137.      * Render to screen *
  138.      * **************** */
  139.     glUseProgram(NULL);
  140.  
  141.     glActiveTexture(GL_TEXTURE0);
  142.     glBindTexture(GL_TEXTURE_2D, renderResultPass0);
  143.         glEnable(GL_TEXTURE_2D);
  144.             glBegin(GL_QUADS);
  145.                 glTexCoord2f(0.0, 0.0);
  146.                 glVertex2f(-1.7f, -1.7f);
  147.                    
  148.                 glTexCoord2f(0.0, 1.0);
  149.                 glVertex2f(-1.7f, 1.7f);
  150.  
  151.                 glTexCoord2f(1.0, 1.0);
  152.                 glVertex2f(1.7f, 1.7f);
  153.  
  154.                 glTexCoord2f(1.0, 0.0);
  155.                 glVertex2f(1.7f, -1.7f);
  156.             glEnd();
  157.         glDisable(GL_TEXTURE_2D);
  158.     glBindTexture(GL_TEXTURE_2D, 0);
  159. }
  160.  


Hoffe das ihr mir helfen koennt!

Gruesse,
pfefferkeks


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 15:38 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
war falsch


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:18, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 15:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Willkommen im Forum. :)

Einfach mal so ins Blaue hinein geraten, da ich mich mit Shadern so gar nicht auskenne. Du solltest evtl. die Texturen auch beide aktivieren. Also du musst glBindTexture und glEnable(GL_TEXTURE_2D) pro Textureeinheit aufrufen. Und wenn du sie nicht mehr brauchst auch wieder deaktivieren. Besonders die TMU1, da du später zwar die Textur in der TMU0 ersetzt, allerdings die TMU1 nicht mehr anrührst. Somit wird das die restliche Darstellung verfälschen können.

PS: Bevor du dich wunderst. Ich vermute, dass die erste durch das Laden der Texturen bereits aktiviert wurde. Die müsste ansonsten ja auch "tot" sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 15:41 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
egal


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:18, insgesamt 2-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 15:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie gesagt. Shader sind nicht so mein Fachgebiet. Aber wenn der Shader sich nicht darum kümmert ob die aktiviert oder deaktiviert sind dann ist ja gut. :) Werde ich mir merken (hoffentlich).


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 15:48 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
Macht nix


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:18, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 15:49 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Hey,

danke fuer die Antworten, gleich vorne weg es geht immer noch nicht ;-).

elektrokrach: Wenn ich versuche einen dritten Parameter wie vorgeschlagen mit zu uebergeben bekomme ich die Meldung: Zu viele Argumente.
Darauf hin habe ich noch mal schnell nachgeschaut: http://developer.3dlabs.com/documents/G ... cation.htm
Nur zwei Argumente. Ich muss das ganze unter C++ mach was den Unterschied erklaeren koennte.

Lossy eX, elektrokrach zum zweiten Post: Stimmt so kenne ich das auch.

Hatt jemand sonst noch eine Idee woran es liegen koennte?

Danke,
pfefferkeks


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 16:03 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
erledigt


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:18, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 16:30 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Macht ja nix, die Idee fand ich auf jeden Fall gut und ich habe fuer einen Moment Hoffnung geschoepft ;-).
Werde es gleich mal on FBO versuchen.

Gruesse,
pfefferkeks


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 16:37 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Habe das ganze jetzt mal ohne FBO versucht. Das scheint zu klappen.
Der Code ist (funktioniert):
Code:
  1.  
  2. void ShaderBlurMeanFilter::renderToScreen(void) {
  3.     int uniformLocation0 = -1;
  4.     int uniformLocation1 = -1;
  5.  
  6.     // Set uniform variablen
  7.     uniformLocation0 = glGetUniformLocation(shaderProgramHandlePass0, "tmpTex1");
  8.     if(-1 == uniformLocation0) {
  9.         std::cout << "Can't find tmpTex1 in Pass0" << std::endl;
  10.     }
  11.     glActiveTexture(GL_TEXTURE0);
  12.     glBindTexture(GL_TEXTURE_2D, tmpTex1);
  13.     glUniform1iARB(uniformLocation0, 0);
  14.  
  15.     uniformLocation1 = glGetUniformLocation(shaderProgramHandlePass0, "tmpTex2");
  16.     if(-1 == uniformLocation1) {
  17.         std::cout << "Can't find tmpTex2 in Pass0" << std::endl;
  18.     }
  19.     glActiveTexture(GL_TEXTURE1);
  20.     glBindTexture(GL_TEXTURE_2D, tmpTex2);
  21.     glUniform1iARB(uniformLocation1, 1);
  22.  
  23.     // Use shader
  24.     glUseProgram(shaderProgramHandlePass0);
  25.  
  26.     glBegin(GL_QUADS);
  27.         glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
  28.         glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
  29.         glVertex2f(-1.7f, -1.7f);
  30.        
  31.         glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
  32.         glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0);
  33.         glVertex2f(-1.7f, 1.7f);
  34.  
  35.         glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
  36.         glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0);
  37.         glVertex2f(1.7f, 1.7f);
  38.  
  39.         glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
  40.         glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
  41.         glVertex2f(1.7f, -1.7f);
  42.     glEnd();
  43. }
  44.  


Ob jemand meinen Fehler in dem FBO findet? Oder ist es gar garnicht moeglich multitextureing + FBO + Shader zu nutzen?

Danke


Zuletzt geändert von pfefferkeks am Mo Nov 19, 2007 17:19, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 16:47 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
forget it


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:18, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 17:19 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Habe den Tippfehler mal raus genommen, da der keine Absicht war :-). Das kommt leider schon mal vor bei mir. Sorry.

elektrokrach: Klar kannst den Code von dem Shader haben, sobalt er fertig ist schicke ich ihn dir.

Was meinst du mit Combinern? Google bringt mir zwar das es so was gibt aber was richtig greifbares leider nicht.

Gruesse,
pfefferkeks


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 17:22 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
erledigt


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:19, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 17:27 
Offline
DGL Member

Registriert: Mo Nov 19, 2007 14:34
Beiträge: 15
Ok,
dann werde ich den FBO jetzt mal wieder in meine Anwendung reinnhemen. Werde ihn mal neue machen in der Hoffnung das ich den Fehler nicht noch mal mache :-).
Hoffe es klappt dann, sonst werde ich die Combinder versuchen.

Aber eins noch wenn du noch mal in den Code vom ersten Post schaust, schalte ich doch das FBO ab und binde die Texture bevor ich sie nutze. Geht das so oder muss ich sie direkt nach dem Abschlaten binden oder erst wenn ich sie benoetige?

Thanks,
pfefferkeks


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Nov 19, 2007 17:38 
Offline
DGL Member

Registriert: Di Okt 23, 2007 10:20
Beiträge: 84
bringt nix


Zuletzt geändert von elektrokrach am Di Nov 27, 2007 11:19, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 25 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 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.009s | 15 Queries | GZIP : On ]