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

Aktuelle Zeit: Mi Mai 15, 2024 05:31

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Di Feb 28, 2012 13:19 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 28, 2012 18:32 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
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

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Feb 28, 2012 20:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
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?

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 01, 2012 10:13 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
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


Zuletzt geändert von heavenssake007 am Do Mär 01, 2012 10:37, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 01, 2012 10:34 
Offline
DGL Member
Benutzeravatar

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

_________________
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  
BeitragVerfasst: Do Mär 01, 2012 14:08 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2621
Wohnort: Berlin
Programmiersprache: Go, C/C++
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.

_________________
"Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren"
Benjamin Franklin

Projekte: https://github.com/tak2004


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mär 01, 2012 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 27, 2005 12:44
Beiträge: 393
Wohnort: Berlin
Programmiersprache: Java, C++, Groovy
@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.

_________________
Wenn Gauß heute lebte, wäre er ein Hacker.
Peter Sarnak, Professor an der Princeton University


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 05, 2012 12:39 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
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


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 05, 2012 13:00 
Offline
DGL Member
Benutzeravatar

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

_________________
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  
BeitragVerfasst: Mo Mär 05, 2012 14:54 
Offline
DGL Member

Registriert: Fr Jan 16, 2009 13:36
Beiträge: 75
@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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 05, 2012 16:02 
Offline
DGL Member

Registriert: Sa Mär 14, 2009 17:48
Beiträge: 99
Programmiersprache: D, Java, C++
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!


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 12, 2012 15:24 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
@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.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mär 12, 2012 20:27 
Offline
DGL Member
Benutzeravatar

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

_________________
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  
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 2 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.024s | 17 Queries | GZIP : On ]