DGL
https://delphigl.com/forum/

Die zweite Texture scheint nicht im Shader an zu kommen
https://delphigl.com/forum/viewtopic.php?f=20&t=7070
Seite 1 von 2

Autor:  pfefferkeks [ Mo Nov 19, 2007 15:23 ]
Betreff des Beitrags:  Die zweite Texture scheint nicht im Shader an zu kommen

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

Autor:  elektrokrach [ Mo Nov 19, 2007 15:38 ]
Betreff des Beitrags: 

war falsch

Autor:  Lossy eX [ Mo Nov 19, 2007 15:39 ]
Betreff des Beitrags: 

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.

Autor:  elektrokrach [ Mo Nov 19, 2007 15:41 ]
Betreff des Beitrags: 

egal

Autor:  Lossy eX [ Mo Nov 19, 2007 15:47 ]
Betreff des Beitrags: 

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).

Autor:  elektrokrach [ Mo Nov 19, 2007 15:48 ]
Betreff des Beitrags: 

Macht nix

Autor:  pfefferkeks [ Mo Nov 19, 2007 15:49 ]
Betreff des Beitrags: 

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

Autor:  elektrokrach [ Mo Nov 19, 2007 16:03 ]
Betreff des Beitrags: 

erledigt

Autor:  pfefferkeks [ Mo Nov 19, 2007 16:30 ]
Betreff des Beitrags: 

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

Autor:  pfefferkeks [ Mo Nov 19, 2007 16:37 ]
Betreff des Beitrags: 

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

Autor:  elektrokrach [ Mo Nov 19, 2007 16:47 ]
Betreff des Beitrags: 

forget it

Autor:  pfefferkeks [ Mo Nov 19, 2007 17:19 ]
Betreff des Beitrags: 

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

Autor:  elektrokrach [ Mo Nov 19, 2007 17:22 ]
Betreff des Beitrags: 

erledigt

Autor:  pfefferkeks [ Mo Nov 19, 2007 17:27 ]
Betreff des Beitrags: 

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

Autor:  elektrokrach [ Mo Nov 19, 2007 17:38 ]
Betreff des Beitrags: 

bringt nix

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