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

Aktuelle Zeit: Fr Jul 18, 2025 08:12

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Tiefentextur
BeitragVerfasst: Do Mai 21, 2009 02:53 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Hallo,

Ich bin gerade am verzweifeln, weil ich einfach nicht den Tiefenbuffer in eine Textur bekomme. Irgendwann hatte ich das schonmal geschafft, aber jetzt scheint es nicht mehr zu gehn. Wahrscheinlich hab ich irgendwo was verändert.
Alle Ergebnisse die ich bekomme sind entweder komplett Weiß oder Schwarz und ich hab schon einige Kombinationen der in Frage kommenden Befehle ausprobiert.
Also wenn vielleicht jemand ein Stückchen Code hat, von dem er weiß das er funktioniert würde mir das schon reichen. Am besten vom Erstellen der Textur und vom reinkopieren der Tiefeninformationen. Außerdem wenn möglich ohne FBO.
Und wenn ich das ganze dann in einem Shader verwende, müsste es doch ausreihen die Textur als "sampler2D" zu übergeben oder muss ich da "samper2DShadow" nehmen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 21, 2009 11:11 
Offline
DGL Member
Benutzeravatar

Registriert: Di Mai 18, 2004 16:45
Beiträge: 2623
Wohnort: Berlin
Programmiersprache: Go, C/C++
Wenn du ein Shader nutzt, dann kannst du auch ein FBO verwenden.
Bzw. ich wusste nicht, dass ohne FBO man überhaupt in eine Textur schreiben kann (innerhalb der Renderpipeline), wie funktioniert das ?
Hast du vieleicht die Skalierung deiner Szene verändert, dass du schon ein Tiefenbild bekommst aber es nicht die entsprechende Tiefenqualität bzw. die Objekte zu weit weg liegen?

_________________
"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  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 21, 2009 11:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Das hier sieht ganz hilfreich aus:
http://www.gamedev.net/community/forums ... _id=409775

Wenn es dir wirklich um echte Tiefenwerte geht solltest du auch eine Depth-Textur nehmen. Ein Tiefenbuffer hat üblicherweise 24bit. Mit einer 8bit Graustufentextur kommst du da nicht weit. Selbst wenn du eine 32bit-Floattextur verwendest könntest verfälschte Ergebnisse bekommen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 21, 2009 13:47 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also ich hab' es jetzt nochmal mit einem Backup versucht und jetzt funktioniert es. Allerdings frag' ich mich was ich anders gemacht habe, weil ich auch schon gestern mit dem alten Quelltext rumprobiert habe. Eigentlich hätte ich an der Stelle an der ich eine weiße Textur hatte weitermachen müssen, weil da ja schon irgendwie ersichtlich ist, dass etwas hineinkopiert wurde. Naja, allerdings war es auch schon recht spät.
Aber in erster Linie bin ich nur froh, dass es klappt.

Ich poste mal hier das Ergebniss, für den Fall das ich mein Programm wieder versaubeutel oder jemand anderes das selbe Problem hat.

Textur erstellen:
Code:
  1.  
  2. glGenTextures(1, @TexID);
  3. glBindTexture(GL_TEXTURE_2D, TexID);
  4. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0, 0, aWidth, aHeight, 0);
  5. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  6. glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  7.  


Tiefenbuffer reinkopieren:
Code:
  1.  
  2. glBindTexture(GL_TEXTURE_2D, TexID);
  3. glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, aWidth, aHeight);
  4.  


Eigentlich ganz simpel. Der Texturfilter ist auf "GL_NEAREST" weil man nicht einfach so zwischen den Tiefenwerten interpolieren sollte. Ansonsten ist ja schon floatalles selbsterklärend.
Wenn man eine RGB-Textur will, kann man auch "GL_DEPTH_COMPONENT" durch "GL_RGB" ersetzen, ohne dass man den anderen Code ändern muss (insbesondere den zum Kopieren der Daten) was ich ziemlich praktisch finde.
Im Wiki is "GL_DEPTH_COMPONENT" nicht als gültiger Parameter für "glCopyTexImage2D" angegeben, was mich auch erst stutzig gemacht hat. Wahrscheinlich ist es da nicht aktuell/vollständig. Unter http://www.opengl.org/sdk/docs/man/xhtml/glCopyTexImage2D.xml sind noch ein paar mehr Parameter eingetragen.

Edit:
Noch ein paar Ergänzungen für die Benutzung in Shadern:

Da ich jetzt auch erstmal ein paar Probleme mit der Umrechnung der Werte aus der Textur hatte, schreib' ich hier mal noch die Lösung.
Also die Werte die man mit "texture2D" im Shader bekommt sind im Bereich [0.0,1.0]. Allerdings nicht linear.
Code:
  1.  
  2. float a = FarClip/(FarClip-NearClip);
  3. float b = FarClip*NearClip/(NearClip-FarClip);
  4. float depth = texture2D(textur1, gl_TexCoord[0]).x;
  5. float z=b/(depth-a);
  6.  


"z" ist allerdings nicht die Entfernung von der Kameraposition zum Punkt, sondern nur die Z-Komponente. Man kann aus der Lichtposition L relativ zur Fragmentposition v, die Tiefe entlang der Blickrichtung S aus der die Depthtexture aufgenommen wurde, errechnen mit "z=dot(v-L,normalize(S))".
Bei mir hab' ich das ganze mit einer CubeMap gemacht welche die Tiefenwerte enthält. In dem Fall hat man 6 Blickrichtung entlang der Normalen der Würfelflächen.

Als "sampler2DShadow" ist das ganze wahrscheinlich nochmal ganz anders, das hab ich allerdings noch nicht ausprobiert.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 21, 2009 16:47 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Was willst du denn genau machen? Weil wie schon oben erwähnt: mit einem FBO könntest du dir u. U. das Kopieren sogar sparen

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 21, 2009 17:12 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Im Prinzip ging es um Schatten. Das mit dem FBO werd' ich auch noch ausprobieren. Ich hab jetzt bloß die Variante zuerst bemacht, weil ich eigentlich schon wusste/hätte noch wissen müssen wie es ging. FBOs hatte ich zwar auch schon gemacht, aber ohne Zugriff auf deren Tiefenbuffer. Und wie das ganze bei CubeMaps funktionieren soll, weiß ich erst recht nicht.

Edit:
OK, ich glaube die Frage wie das bei Cubemaps geht hat sich erledigt, nachdem ich das gelesen hab:http://www.khronos.org/opengles/sdk/docs/man/glFramebufferTexture2D.xml


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 21, 2009 18:34 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
Wie würde ich denn ein FBO einrichten, mit dem ich in eine depth-cube-map schreibe? Wie würde ich die am sinnvolsten in einem Shader auslesen? Kann mir dazu jemand was erklären? Ich suche da schon sehr lange nach und stoße ständig auf taube Ohren.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Mai 21, 2009 19:00 
Offline
DGL Member

Registriert: Fr Okt 03, 2008 13:32
Beiträge: 367
Also ich hab das jetzt noch nicht ausprobiert, aber ich schätze mal man kann die CubeMap-Seiten so wie normale Textures als Tiefenbuffer festlegen.
Code:
  1.  
  2. glGenFramebuffersEXT(1, @FBO);
  3. glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
  4. glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, DepthTexID, 0);
  5.  


Für eine Cubemap wird dann denke ich einfach "GL_TEXTURE_2D" durch "GL_TEXTURE_CUBE_MAP_POSITIVE_X+i" ersetzt. TexturIDs hat eine Cubemap ja auch nur eine, also wird die wohl gleich bleiben bei jeder Seite. So wie es aussieht muss man aber das Depth-Attachment für jede Seite ändern, wenn nicht jemand eine andere Lösung hat.

Im Shader kann man dann wohl nur als normale Cubemap darauf zugreifen, oder gibt es sowas wie "samplerCubeShadow"?
Edit: Anscheinend gibt es sowas sogar wirklich, allerdings erst ab glsl 1.30.


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot] 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.010s | 16 Queries | GZIP : On ]