DGL
https://delphigl.com/forum/

Lookup Table Problem mit einer sample 3d Textur
https://delphigl.com/forum/viewtopic.php?f=20&t=10329
Seite 1 von 1

Autor:  heavenssake007 [ Di Feb 28, 2012 13:19 ]
Betreff des Beitrags:  Lookup Table Problem mit einer sample 3d Textur

Hallo,

Ich habe ein Problem mit einer 1D Lookup Table innerhalb meines Fragmentshaders. Der Shader sieht so aus:

Code:
  1.  
  2.  
  3. uniform sampler3D Tex1;
  4. uniform sampler1D ctable;
  5. varying vec3 TexCoord;
  6.  
  7.  
  8. void main()
  9. {
  10.     vec4 value   = texture3D(volume,TexCoord);
  11.     vec4 color;
  12.           color.r   = texture1D(ctable,value.r).r;
  13.           color.g   = texture1D(ctable,value.g).g;
  14.           color.b   = texture1D(ctable,value.b).b;
  15.           color.a   = texture1D(ctable,value.a).a;       
  16.    
  17.     gl_FragColor = color;  
  18. }
  19.  


Lasse ich die 3D Textur wie folgt ausgeben zeigt er mir die VolumenTextur:

Code:
  1.  
  2. void main()
  3. {
  4.     vec4 value   = texture3D(volume,TexCoord);
  5.     vec4 color;
  6.           color.r   = value.r;
  7.           color.g   = value.g;
  8.           color.b   = value.b;
  9.           color.a   = value.a;       
  10.    
  11.     gl_FragColor = color;  
  12. }
  13.  


Nehme ich einen bestimmten Wert aus der Lookuptable gibt er mir diesen in meinem 3d Cube aus

Code:
  1.  
  2. void main()
  3. {
  4.     vec4 value   = texture3D(volume,TexCoord);
  5.     vec4 color;
  6.           color.r   = texture1D(ctable,250).r;
  7.           color.g   = texture1D(ctable,250).g;
  8.           color.b   = texture1D(ctable,250).b;
  9.           color.a   = texture1D(ctable,250).a;       
  10.    
  11.     gl_FragColor = color;  
  12. }
  13.  


Nur zusammen bekomme ich immer einen leeren Cube, obwohl ich per glgetUniformLocation bei der Übergabe der Texturen an den Shader zwei Werte, 0 (3dTexture) und 1 (ColorTable) zurückbekomme.
Ich habe die Texturen so gebunden:

Code:
  1.  
  2.    glGenTextures(3,@FTextureIds);
  3.    glActiveTexture(GL_TEXTURE0);
  4.    glBindTexture(GL_TEXTURE_3D,FTextureIds[0]);
  5.  
  6.  
  7.    //set the texture parameters
  8.    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP);
  9.    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP);
  10.    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP);
  11.    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  12.    glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  13.  
  14.    glTexImage3D(GL_TEXTURE_3D,0,GL_RGBA,cXMAX,cYMAX,cZMAX,0,GL_RGBA,GL_UNSIGNED_BYTE,@FBuf[0]);
  15.  


Das gleiche habe ich für die 1D Color Table gemacht, nur eben in 1D.

Weiß jemand einen guten Rat? Mir kommt es sehr komisch vor, dass es seperat funktioniert aber in Verbindung nicht.
Ich benutze eine QuadroFX570 und habe mir mal sicherheitshalber ein Update von NVIDIA gezogen. Somit bin ich nun bei GLSL 3.3

Vielen Dank,

Heavenssake007

Autor:  dj3hut1 [ Di Feb 28, 2012 18:32 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

Hallo heavenssake007,

wenn deine Texturen unsigned byte als Format haben, solltest du für "value" auch "uvec4" als Datentyp wählen. Ich nehme mal an, dass bei dem Format vec4 (floating point) die Rückgabewerte der 3D-Textur auf 0 bis 1 gemappt werden, was beim 1D-Lookup dann natürlich nicht mehr das gewünschte Ergebnis bringt.

Viele Grüße
dj3hut1

Autor:  Coolcat [ Di Feb 28, 2012 20:57 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

Zitat:
was beim 1D-Lookup dann natürlich nicht mehr das gewünschte Ergebnis bringt.

Texturkoordinaten sollten doch auch bei einer 1D-Textur zwischen 0 und 1 liegen?

Autor:  heavenssake007 [ Do Mär 01, 2012 10:13 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

Ersteinmal vielen Dank für die schnellen Antworten.
Ich habe nun viele Sachen probiert. Von der Konvertierung des Datentyps innerhalb meines Shaders (uvec4 statt vec4) bis zur kompletten Änderung des Datentyps meiner Textur und meiner LookupTable in float. Da ich dachte wenn es ein Problem mit dem Mapping gibt (0-255) könnte ich der GPU dies abnehmen.
Dann folgte ein Test auf einer anderen Grafikkarte, was genauso wenig funktionierte. Kennt Ihr vielleicht ein kleines Test Tool das genau diesen Lookup auf eine 3d Textur oder 2d Textur mit Hilfe einer 1D Textur macht. Vielleicht mache ich irgendeinen dummen Fehler beim Aufruf. Ist es zum Beispiel wichtig das glActiveTexture(GL_Texture0) aufzurufen? Ich frage deswegen, weil ich ein CG Programm habe (Coolcat weiss bescheid :) ) wo kein glActiveTexture(GL_Texture0) vor dem eigentlichen Binden der Textur erfolgt. Ich hatte übrigens mal die floats des vec4 Value mit 255 multipliziert, da meine 1D Textur ja ein Byte Array der Grösse (4*255) also RGBA ist. Da es ja sein kann, dass er sonst nur im Bereich von 0-1 schaut, und da stehen fast immer nur nullen drin, was das Verhalten erklären würde. Jedoch hatte ich damit keinen Erfolg. Ich benutze auch keine ARB Erweiterung. Könnte dies ein Problem sein? Und dann habe ich noch gelesen, dass GL_FragColor deprecated ist. Aber durch was wird dies dann ersetzt? Entschuldigt die vielen Fragen, aber google konnte mir diese Fragen bisher nicht beantworten. Zumindest nicht vollständig.


Heavenssake007

Autor:  Lord Horazont [ Do Mär 01, 2012 10:34 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

Also mal eine allgemeine Shader-Textur-Checkliste:
  • Die Sampler-Uniforms müssen auf den Index der Texturunit gesetzt werden.
  • glEnable(GL_TEXTURE_2D) ist nicht nötig, schadet aber auch nicht
  • glActiveTexture(...) hat man am besten drin; Um den ersten Punkt z.B. sicher abzudecken, und bei mehr als einer Textur braucht man's eh.
  • Testausgabe produzieren. Einfach mal mit einfachen Texturkoordinaten jede Textur einzeln rendern im Shader, während alle gebunden sind. Wenns nicht klappt, einzeln dinge wegnehmen

greetings

Autor:  TAK2004 [ Do Mär 01, 2012 14:08 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

Bei Lookup tables sollte man folgendes beachten.
-mipmaps abschalten
-keine interpolation(GL_NEAREST für min und mag filter)
-wiederholung abschalten(GL_CLAMP)

Die Lookuptable soll ja den richtigen Wert raus suchen und nicht ein Datenbrei aus mehreren Werten interpolieren.
Wiederholung schaltet man ab, damit nicht durch rundungsfehler eventuell der erste Pixel statt der letzte genommen wird.

Autor:  dj3hut1 [ Do Mär 01, 2012 16:56 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

@Coolcat Stimmt, Texturkoordinaten sollten immer zwischen 0 und 1 liegen. Ich war etwas irritiert wegen dem Testaufruf texture1D(ctable,250), der dann ja so keinen Sinn macht.

Autor:  heavenssake007 [ Mo Mär 05, 2012 12:39 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

Hallo Ihr Helfer,

Vielen Dank für all die Tips. Mein grosser Fehler war am Ende, dass ich bei der Übergabe der Texturen an den Shader die falschen TexturIds übergeben habe. Ich habe Sie jedesmal mit GenTexture(1,@TexIDVolume) und GenTexture(1,@TexIDColorTable) generiert, wobei ich ja jedesmal ein neuen Integer Wert festlegen muss.
Diese TexId habe ich über glUniform1i an den Shader gesendet. Klar, dass da nichts Sinnvolles rauskommen kann, wenn eine der beiden Texturen immer nur im Speicher liegt.
Zu Fuss via glUniform1i(loc,0) und glUniform1i(loc,1) funktionierte es dann natürlich.

Wie gesagt, vielen Dank nochmal für Eure Hilfe.

Heavenssake007

Autor:  Lord Horazont [ Mo Mär 05, 2012 13:00 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

Schön zu wissen, dass meine Posts gelesen werden ;)
Lord Horazont hat geschrieben:
  • Die Sampler-Uniforms müssen auf den Index der Texturunit gesetzt werden.


greetings

Autor:  heavenssake007 [ Mo Mär 05, 2012 14:54 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

@Lord Horazont
Tja, hätte ich mir eine Menge Zeit und Nerven gespart. Ich bin blöderweise davon ausgegangen, dass die Textur IDs, die ich generiert habe, stimmen.

Autor:  Skeptiker [ Mo Mär 05, 2012 16:02 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

heavenssake007 hat geschrieben:
@Lord Horazont
Tja, hätte ich mir eine Menge Zeit und Nerven gespart. Ich bin blöderweise davon ausgegangen, dass die Textur IDs, die ich generiert habe, stimmen.


Nur nochmal weil ich glaube da liegt ein Missverständnis vor: Deine Texture IDs werden schon stimmen, leider möchte der Sampler im Shader diese aber garnicht haben, um eine Textur im Shader Sampeln zu können benötigt dieser die Texture Unit an die du die jeweilige Textur gebunden hast!

Du musst also mit glActiveTexture(GL_TEXTUREi) die Texture-Unit auswählen und dann mit glBindTexture(...) die Texture ID an die Texture Unit binden, was dein Shader dann möchte ist das was du an glActiveTexture übergeben hast (also nicht den Wert der Konstante selbst, sondern die "Bedeutung" der Konstante, also 0 bei GL_TEXTURE0, 1 bei GL_TEXTURE1, ...).

Falls dir das bereits klar war entschuldige ich mich, aber immerhin dürfte es dem ein oder anderen Helfen der hier über Google hinfindet.

Viele Grüße!

Autor:  Sellmann [ Mo Mär 12, 2012 15:24 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

@Skeptiker: Das ist ein ganz häufig auftretendes Missverständnis dem ganz viele auf dem Leim gehen. Meistens funktioniert das in Beispiel-Programmen nur zufällig, weil dort wenige Texturen verwendet werden und deren IDs dann oft gleich der verwendeten TUs sind. Interessanterweise bin ich selbst nach jahrelanger Erfahrung diesem Irrtum auch noch einmal zum Opfer gefallen, als ich vor kurzem von der Arbeit aus einige Bildfilter implementieren musste.
Ich wäre dafür, dass man das evtl. noch in einem der Shader Tutorials als wichtigen Hinweis markiert! Intuitiv macht man das sonst meistens falsch (als Anfänger). Zumindest hatte ich beim stöbern im Internet oft den Eindruck, dass das häufig ein Problem ist.

gruß, sellmann.

Autor:  Lord Horazont [ Mo Mär 12, 2012 20:27 ]
Betreff des Beitrags:  Re: Lookup Table Problem mit einer sample 3d Textur

Habs neulich mal zu der Checkliste Shader hinzugefügt. Hoffentlich hilft das.

Aber ja, das Problem sehe ich auch immer wieder, hier im Forum und anderswo. Ich konnts mir inzwischen abgewöhnen.

greetings

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