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

Aktuelle Zeit: So Jul 20, 2025 05:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: multitexturing in Fragmentshader
BeitragVerfasst: Do Okt 18, 2007 17:05 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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...

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 18, 2007 17:22 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 18, 2007 17:38 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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.

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 18, 2007 18:10 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 18, 2007 19:58 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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?

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Okt 18, 2007 20:24 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 19, 2007 06:48 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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ß?

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 19, 2007 08:23 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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.  

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 19, 2007 08:29 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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....

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Ich schließe den Thread
BeitragVerfasst: Fr Okt 19, 2007 09:59 
Offline
DGL Member

Registriert: Sa Sep 29, 2007 18:43
Beiträge: 38
Wohnort: STR / BLN / LAU
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:

_________________
Tu es oder tu es nicht!
Tu es hier und jetzt oder tu es nicht hier und jetzt!
Aber tu niemals etwas und denke du würdest es lieber nicht tun....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Okt 19, 2007 13:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
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

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Okt 20, 2007 00:53 
Offline
DGL Member
Benutzeravatar

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

_________________
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: Sa Okt 20, 2007 01:07 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Da muss man aufpassen. Wenn man die Variable nicht verwendet, gibt glGetUniformLocation auch -1 zurück.


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


Wer ist online?

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