Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

1

22.06.2010, 20:30

FBO Depthtexture Problem [re-opened]

Hi

Folgendes sei gegeben:

- Ich habe ein FBO sowie einen Depthbuffer, der an das FBO gebunden ist.
- Ebenso ist eine Farbtextur an das FBO gebunden.

Ich will erreichen:

- Den Inhalt der Farbtextur in den Standard-Framebuffer zeichnen.
- Dabei soll sich der neu gezeichnete Inhalt korrekt mit dem bereits im Standard-Framebuffer enthaltenen Resultat überlagert.

Mein Problem:

- Es scheint nicht möglich, dass das FBO sowie der Standard-Framebuffer denselben Depthbuffer verwenden. [Quelle]
- Auch fällt weg, per Shader den Inhalt des Depthbuffers des FBO's zu lesen und als Depth-Wert des Fragments zu setzen. [Quelle]

Meine Idee:

- Beim Zeichnen in den FBO wird per MRT der Depth-Wert jedes Fragments in eine zusätzliche Textur geschrieben.

Meine Frage:

- Welches Pixelformat würde ich für diese zusätzliche Textur nehmen? Am ehesten würde sich IMO ein 1-Channel-Fließkomma eignen?
- Gibt es eine performantere Idee, als die mit MRT?

Danke im Voraus
<< an dieser Stelle ist eine Signatur verstorben >>

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »the[V]oid« (26.06.2010, 20:36)


dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

22.06.2010, 22:38

Ich würde mal schaun ob du nicht einfach direkt eine Textur als Tiefenpuffer verwenden kannst. In OpenGL sollte das im Gegensatz zu D3D9 afaik eigentlich funktionieren...

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

3

22.06.2010, 23:06

Danke, hab mal schnell danach gegooglet, scheint echt zu gehen:

Einfach Textur mit Pixelformat GL_DEPTH_COMPONENT erstellen und als GL_DEPTH_ATTACHMENT binden.
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

22.06.2010, 23:12

Jop. Wobei ich GL_DEPTH_COMPONENT16 bzw. GL_DEPTH_COMPONENT24 nehmen würde, je nachdem was für ein Format dein z-Buffer hat...

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

5

22.06.2010, 23:35

Die Bedeutung der 16 und der 24 ist mir ja klar, aber was bewirkt die Konstante ohne der Angabe?
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

22.06.2010, 23:42

[...] aber was bewirkt die Konstante ohne der Angabe?

Tjo, eben deswegen würd ich die Variante mit der Konstante bevorzugen ;) (generell beim internalFormat immer entsprechend konkrete Formate verwenden. Also GL_RGBA8 statt GL_RGBA etc.) Ansonsten sucht sich der Grafiktreiber einfach was aus...

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

7

24.06.2010, 16:03

Muss ich irgendwas besonderes beachten bei der Verwendung einer Depthtexture an Stelle eines Depthbuffers, insbesondere vllt. im Shader? Denn anstatt einer korrekt gerenderten Szene sehe ich nun nur noch farbenfrohe Pixel und Artefakte...


EDIT: Das FBO wird korrekt generiert, ich registriere keinelei GL-Fehler. Auch funktioniert das FBO in einer kleinen Minimalanwendung getestet, aber eben wenn ich es in einen größeren Kontext einfüge, wo z.B. intensiver Gebrauch von Shadern gemacht wird, kommt es zu Problemen. Offensichtlich verhält sich dieses FBO mit Depthtexture statt Depthbuffer also anders. Und meine Frage lautet: Worin genau äußert sich dieses andere Verhalten?
<< an dieser Stelle ist eine Signatur verstorben >>

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »the[V]oid« (24.06.2010, 16:10)


the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

8

26.06.2010, 20:03

Hab mal bischen rumprobiert. Wenn ich GL_RGBA8 als Pixelformat des FBO benutze, klappt alles. Aber sobald ich das Pixelformat auf GL_RGBA16F ändere, sehe ich nur die besagten Artefakte und das Programm schmiert nach einer Weile ab, ohne dass der Debugger vernünftige Daten liefern würde.

Ist es möglich, dass es (GL_RGBA16F Pixelformat und Depthtexture) eine Kombination ist, die von meiner GraKa nicht unterstützt wird? Die ist schon bischen älter... GeForce6600. Jedenfalls überprüfe ich den Status des FBO nachdem er fertig gebacken ist und da bekomme ich keinen Fehler gemeldet.

FBO mit GL_RGBA16F und ohne Depthtexture funzt wunderbar.


EDIT: Lustigerweise funzt es mit GL_RGBA32F deutlich besser, ganz korrekt sieht das Bild da auch nicht aus. Allerdings fällt die Framerate dann auf weit unter 1 auf meiner antiken Kiste.
<< an dieser Stelle ist eine Signatur verstorben >>

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »the[V]oid« (26.06.2010, 20:09)


the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

9

11.07.2010, 15:06

Hab jetzt das System ausgewechselt. GeForce 6600 zu 6600 GT. Das alleine hat keine Lösung gebracht.
Aaaaber: GL_DEPTH_COMPONENT24 an Stelle von GL_DEPTH_COMPONENT16.
Damit geht's. Warum? Keine Ahnung.
<< an dieser Stelle ist eine Signatur verstorben >>

the[V]oid

Alter Hase

  • »the[V]oid« ist der Autor dieses Themas

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

10

11.07.2010, 23:45

So, jetzt gibt es aber das nächste Problem.

Ich rendere ein paar Objekte in ein FBO, welches eine Depth-Texture hat. Anschließend rendere ich den Inhalt der Farb- sowie Tiefentextur in den Standard-Framebuffer, mit Shader. Außerdem wird natürlich die Uniform für die Texture-Unit gesetzt, auf der die Tiefentextur gebindet ist. Für das Texturobjekt der Tiefentextur ist GL_DEPTH_TEXTURE_MODE auf GL_ALPHA gesetzt. Zuletzt rendere ich noch einen Quad ohne Shader. Das Ergebnis sieht wie folgt aus:



Jemand eine Idee, woran das liegen könnte? Die Objekte werden ja offensichtlich irgendwie "beschnitten"..

Der Code des Fragment-Shaders, auf das wesentliche beschränkt, eigentlich absolut trivial:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
#version 120

uniform sampler2D texture0;
uniform sampler2D depthtex;

void main()
{
   vec3 color = vec3( texture2D( texture0, gl_TexCoord[0].xy ).xy );
   gl_FragColor = vec4( color, 1.0 );
   gl_FragDepth = texture2D( depthtex, gl_TexCoord[0].xy ).a;
}


Glaube kaum, dass hier etwas falsch sein kann...

In Wahrheit wird hier ein horizontales Bluring durchgeführt... aber das spielt ja kaum eine Rolle.

Die Uniform für "texture0" ist auf "int( 0 )" gesetzt und für "depthtex" auf "int( 1 )".

Die Tiefentextur wird generiert durch:

C-/C++-Quelltext

1
2
glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT_24, 800, 600,
              0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL );


Das Weglassen des GL_DEPTH_TEXTURE_MODE auf GL_ALPHA Setzens und ein ".r" an Stelle von ".a" im Fragmentshader führt (erwartungsgemäß) zu selbigem Ergebnis.

Weiß grad nicht, was noch von Relevanz sein könnte..
<< an dieser Stelle ist eine Signatur verstorben >>

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »the[V]oid« (12.07.2010, 14:14)


Werbeanzeige