DGL
https://delphigl.com/forum/

multitexturing in Fragmentshader
https://delphigl.com/forum/viewtopic.php?f=20&t=6987
Seite 1 von 1

Autor:  Daniellus [ Do Okt 18, 2007 17:05 ]
Betreff des Beitrags:  multitexturing in Fragmentshader

Guten Abend alle zusammen,

Meine Fragmentshader liest immer die Werte der ersten von drei Texturen aus.
Ich weiß nun nicht so genau woran es liegt.

Muss man einen Vertexshader (habe keinen geschrieben) schreiben und diesen machen:

Code:
  1. gl_TexCoord[0] = gl_MultitexCoord0.st;


Wofür ist denn überhaupt gl_MultitexCoord0, gl_MultitexCoord1, gl_MultitexCoord3, ...usw?
Ich habe beispiele gefunden, da nimmt man gl_MultitexCoord0 für die Koordinaten von allen Texturen und dann für jede textur eine extra gl_MultitexCoordX.

Na ja hier ist mal der Fragmentshader:

Code:
  1.  
  2. "uniform sampler2D DistImgTexture;" \
  3. "uniform sampler2D QValuesTexture;" \
  4. "uniform sampler2D OffsetCorrTexture;" \
  5. "uniform int iNORM;" \
  6. "void main(void)" \
  7. "{" \
  8. "float norming = 32768.0;" \
  9. "vec4 values = texture2D(DistImgTexture, gl_TexCoord[0].st);" \
  10. "vec4 QValues = texture2D(QValuesTexture, gl_TexCoord[0].st);" \
  11. "vec4 Offset = texture2D(OffsetCorrTexture, gl_TexCoord[0].st);" \
  12. "gl_FragColor.r = diverse Operationen;" \
  13. "gl_FragColor.g = diverse Operationen;" \
  14. "gl_FragColor.b = diverse Operationen;" \
  15. "gl_FragColor.a = diverse Operationen;" \
  16. "}";


Wenn hier kein Fehler existiert, dann liegts wohl am OpenGL-Code...

Autor:  LarsMiddendorf [ Do Okt 18, 2007 17:22 ]
Betreff des Beitrags: 

Man muss mit glUniform1i die Sampler auf die richtige Texture einstelllen.

z.B.

Code:
  1. int l = glGetUniformLocation(fragmentshader,"DistImgTexture");
  2. if (location >= 0) glUniform1i(l,0); // Texture 0
  3. l = glGetUniformLocation(fragmentshader,"QValuesTexture");
  4. if (location >= 0) glUniform1i(l,1); // Texture 1
  5. l = glGetUniformLocation(fragmentshader,"OffsetCorrTexture");
  6. if (location >= 0) glUniform1i(l,2); // Texture 2

Autor:  Daniellus [ Do Okt 18, 2007 17:38 ]
Betreff des Beitrags: 

hallo,

habe ich bereits eingestellt.

Code:
  1.  
  2. glActiveTexture(GL_TEXTURE0);
  3. glBindTexture(GL_TEXTURE_2D, dwDistImgTexture_m);
  4.  
  5. glActiveTexture(GL_TEXTURE1);
  6. glBindTexture(GL_TEXTURE_2D, dwQValueTexture_m);
  7.  
  8. glActiveTexture(GL_TEXTURE2);
  9. glBindTexture(GL_TEXTURE_2D, dwOffsetCorrTexture_m);
  10. ....
  11. ....
  12. //get location of input textures and norming factor in shader
  13. dwDistTexLocation = glGetUniformLocation(dwFragProgram_m, "DistImgTexture");
  14. dwQValTexLocation = glGetUniformLocation(dwFragProgram_m, "QValuesTexture");
  15. dwOffsetCorrTexLocation = glGetUniformLocation(dwFragProgram_m, "OffsetCorrTexture");
  16. dwINormHandle_m = glGetUniformLocation(dwFragProgram_m, "iNORM");
  17.  
  18. //load textures to shader, must be done before glUseProgram();
  19. glUniform1i(dwDistImgTexture_m, GL_TEXTURE0);
  20. glUniform1i(dwQValueTexture_m, GL_TEXTURE1);
  21. glUniform1i(dwOffsetCorrTexture_m, GL_TEXTURE2);
  22.  


muss was anderes sein.

Autor:  Lord Horazont [ Do Okt 18, 2007 18:10 ]
Betreff des Beitrags: 

Sieh den Unterschied.

Du schreibst
Code:
  1.  
  2. glUniform1i(..., GL_TEXTURE0);
  3. glUniform1i(..., GL_TEXTURE1);
  4. glUniform1i(..., GL_TEXTURE2);
  5.  


Besser ist:
Code:
  1.  
  2. glUniform1i(..., 0);
  3. glUniform1i(..., 1);
  4. glUniform1i(..., 2);
  5.  


Gruß Lord Horazont

Autor:  Daniellus [ Do Okt 18, 2007 19:58 ]
Betreff des Beitrags: 

Mmmmh....da hab ich wohl was falsch verstanden. Hinter GL_TEXTURE0 verbirgt sich ja irgendwas anderes jenseits der 0.
Also, ich kann es erst morgen ausprobieren.

Aber dennoch zum Verständnis:

Wenn ich mit glUniform1i(texture0, 0) meine Texturen im Shader identifiziere, wofür muss ich denn
gl_ActivateTexture(GL_TEXTURE0) und anschließende glBindTexture(...,texture0) aufrufen.

Ich dachte das man damit texture0 als Textureinheit 0 festlegt und der Compiler den Rest regelt, das heißt für den richtigen Zugriff im Shader sorgt.
Oder ist der Aufruf gl_ActivateTexture(GL_TEXTURE0) bei einem Fragmentshader überflüssig?

Autor:  LarsMiddendorf [ Do Okt 18, 2007 20:24 ]
Betreff des Beitrags: 

Die Texturen werden genauso gebunden, wie als wenn man keine Shader verwenden würde. Im Shader werden nicht direkt Texturen sondern Sampler deklariert. Der Wert, den man bei glUniform1i übergibt, legt fest von welcher Textureeinheit (GL_TEXTURE0 ... GL_TEXTURE15) dieser Sampler liest. Die sampler im Shader und die Textureeinheiten (GL_TEXTURE0 ... GL_TEXTURE15) haben also erstmal gar nichts miteinander zu tun. Die Zuordnung geschieht über glUniform1i.

Autor:  Daniellus [ Fr Okt 19, 2007 06:48 ]
Betreff des Beitrags: 

Guten Morgen,

also ich habs probiert, aber das hilft auch nicht. Ich lese bei allen 3 Texturen die Werte der ersten Textur aus.

Kann mir jmd bestätigen, das ich definitiv keinen Vertex-Shader brauche, in dem ich explizit die Multitexturkoordinaten für den FragShader zuweisen muß?

Autor:  Daniellus [ Fr Okt 19, 2007 08:23 ]
Betreff des Beitrags: 

Meine Weißheit ist am Ende, ich habe irgendetwas nicht verstanden.
Ich habe jetzt einen Vertexshader geschrieben um die Koordinaten zu übergeben, habe Code-Auszüge aus dem Orange Book (S.263) benutzt. Danach für den Fragmentshader das Gleiche (S. 264-265). Es sind Auszüge für Multitexturing. Anstatt nur Werte der 1. Textur zu lesen, lese ich jetzt r=0, g=0, b=0, a=1, also sind die Texturen gar nicht angekommen.
GLSL-Code aus dem Buch müsste ja eigentlich richtig sein, ergo liegt der Fehler beim Applikations-Code.
Ich zeige den mal. Vielleicht fällt ja jemandem was auf.

Code:
  1.  
  2.  
  3. dwDistTexLocation = glGetUniformLocation(dwFragProgram_m, "DistImgTexture");
  4. dwQValTexLocation = glGetUniformLocation(dwFragProgram_m, "QValuesTexture");
  5.  
  6. glActiveTexture(GL_TEXTURE0);
  7. glBindTexture(GL_TEXTURE_2D, dwDistImgTexture_m);
  8. glUniform1i(dwDistImgTexture_m, 0);
  9.  
  10. glActiveTexture(GL_TEXTURE1);
  11. glBindTexture(GL_TEXTURE_2D, dwQValueTexture_m);
  12. glUniform1i(dwQValueTexture_m, 1);
  13.                                
  14. glUseProgram(dwFragProgram_m);
  15. glUseProgram(dwVertexProgram_m);
  16.  
  17. glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
  18.  
  19. glBegin(GL_QUADS);
  20.     glMultiTexCoord2f(GL_TEXTURE0, 0.0, 0.0);
  21.     glMultiTexCoord2f(GL_TEXTURE1, 0.0, 0.0);
  22.     glVertex2f(0.0, 0.0);
  23.  
  24.     glMultiTexCoord2f(GL_TEXTURE0, 1.0, 0.0);
  25.     glMultiTexCoord2f(GL_TEXTURE1, 1.0, 0.0);
  26.     glVertex2f(dwDistTextureX_m, 0.0);
  27.  
  28.     glMultiTexCoord2f(GL_TEXTURE0, 1.0, 1.0);
  29.     glMultiTexCoord2f(GL_TEXTURE1, 1.0, 1.0);
  30.     glVertex2f(dwDistTextureX_m, dwDistTextureY_m);
  31.  
  32.     glMultiTexCoord2f(GL_TEXTURE0, 0.0, 1.0);
  33.     glMultiTexCoord2f(GL_TEXTURE1, 0.0, 1.0);  
  34.     glVertex2f(0.0, dwDistTextureY_m);
  35. glEnd();
  36.  

Autor:  Daniellus [ Fr Okt 19, 2007 08:29 ]
Betreff des Beitrags: 

Ok es liegt an der Reihenfolge folgender Aufrufe.
Das ist ja schon ein wenig seltsam...
Code:
  1.  
  2. glUseProgram(dwFragProgram_m);
  3. glUseProgram(dwVertexProgram_m);
  4.  


Code:
  1.  
  2. glUseProgram(dwVertexProgram_m);
  3. glUseProgram(dwFragProgram_m);
  4.  


zumindestens lese ich nun wieder die Werte der ersten Textur aus allen sampler2D-Variablen aus....

Autor:  Daniellus [ Fr Okt 19, 2007 09:59 ]
Betreff des Beitrags:  Ich schließe den Thread

Sorry, an die jenigen, die sich ernsthaft nen Kopf gemacht haben.
Danke für den Hinweis mit glUniform1i(...,0). War der Thread nicht ganz umsonst.

:oops: :oops: :oops: :oops: :oops:

Es war ein typischer BUUUUGGGGGG.
Der Code:
Code:
  1.  
  2. dwDistTexLocation = glGetUniformLocation(dwFragProgram_m, "DistImgTexture");
  3. dwQValTexLocation = glGetUniformLocation(dwFragProgram_m, "QValuesTexture");
  4.  
  5. glActiveTexture(GL_TEXTURE0);
  6. glBindTexture(GL_TEXTURE_2D, dwDistImgTexture_m);
  7. glUniform1i(dwDistImgTexture_m, 0);
  8.  
  9. glActiveTexture(GL_TEXTURE1);
  10. glBindTexture(GL_TEXTURE_2D, dwQValueTexture_m);
  11. glUniform1i(dwQValueTexture_m, 1);
  12.  

Der Fehler im Code:
Code:
  1.  
  2. dwDistTexLocation = glGetUniformLocation(dwFragProgram_m, "DistImgTexture");
  3. glUniform1i(dwDistImgTexture_m, 0);
  4.  


Korrektur im Code:
Code:
  1.  
  2. glUniform1i(dwDistTexLocation, 0);
  3.  


Alles Klar?????? Das schreit nach Wochenende....:wink:

Autor:  Lord Horazont [ Fr Okt 19, 2007 13:23 ]
Betreff des Beitrags: 

Ach ja sowas kenn ich.

Hätte ich früher gelesen, dass du in allen drei Units den gleichen Wert hat, hätte ich dir sofort sagen können, dass du mal ganz genau deine Uniform-Locations prüfen sollst, das ist eine typische Ursache dafür.

Gruß Lord Horazont

Autor:  damadmax [ Sa Okt 20, 2007 00:53 ]
Betreff des Beitrags: 

Ich spare mir den quatsch mit der Variablen direkt...
Code:
  1. glUniform1i(glGetUniformLocation(ShaderProgram, "Texture0"), 0);


Gut dann kann ich nicht mehr prüfen obs >0 ist, aber wenn das passiert hab ich sowieso irgendwas falsch gemacht^^


Gruß und schönes Wochenende

Autor:  LarsMiddendorf [ Sa Okt 20, 2007 01:07 ]
Betreff des Beitrags: 

Da muss man aufpassen. Wenn man die Variable nicht verwendet, gibt glGetUniformLocation auch -1 zurück.

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