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

02.01.2010, 22:42

OpenGL - Frage zu einfachen Effekten wie Blur oder Glow

Hallo

Angenommen, ich möchte ein Objekt geblured rendern.
Dabei würde ich wie folgt vorgehen: Zuerst das als geblured zu malende Objekt in eine Textur rendern.
Anschließend die Textur irgendwie verschwimmen lassen (dies ist nicht Teil meiner Frage).
Und zuletzt müsste die Textur dann in den Framebuffer gerendert werden.
Aber wie sieht es hier aus mit den Tiefenwerten? Woher nehm ich die?
Das Objekt (oder besser gesagt dessen Abbild) muss ja weiterhin korrekt andere Objekte verdecken und von anderen Objekten verdeckt werden.

EDIT: Mir würde da eine Möglichkeit einfallen: Beim Rendern in die Textur den Standard-ZBuffer benutzen (wie?) und gleichzeitig in den Stencil-Buffer malen, so kann man beim Rendern der Textur in den Framebuffer über einen Test am Stencilbuffer den gewünschten Effekt erreichen. Geht das aber nicht vielleicht auch einfacher? Und falls nicht, wie verwende ich den Standard-ZBuffer beim Rendern in ein Framebuffer-Object?

Ich hoffe, ich konnte meine Frage verständlich darlegen.
Vielen Dank im Voraus
<< an dieser Stelle ist eine Signatur verstorben >>

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

2

03.01.2010, 00:50

Du scheinst von Tiefenunschärfe zu reden?
Bei normalem Blurr brauchst du keine Tiefenwerte ;)

Wie du gut erkannt hast, ist das mit dem ZBuffer lesen ein ziemliches Problem. Den Z-Buffer kann man erst in DirectX10 (oder wars erst 10.1?) im Pixelshader einlesen.
Der gebräuchliche Ansatz ist: Z-Only-Renderpass auf eine Textur mit einem Kanal (8bit oder gleich 24/32 floating point) rendern - dabei wird der Z-Buffer gleich beschrieben. Dann Colorpass, und dann Blurr-Postpro. Letzterem kannst du dann dein Rendertarget vom Z-Only-Pass wieder als Textur geben.

the[V]oid

Alter Hase

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

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

3

03.01.2010, 00:52

Nee, ich rede nicht von Tiefenunschärfe :?

Dann vielleicht mal anders gefragt: Wie würdest du ein Objekt geblured rendern? Step-by-step bitte ;)
<< an dieser Stelle ist eine Signatur verstorben >>

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

4

03.01.2010, 00:58

Oh sry ich les jetzt gerade erst, dass es dir ja um einzelne Objekte geht... wollte noch nen Edit machen, aber da hast du schon zurückgeschrieben ^^

Hm jup also idR. kannst ja wie gesagt den StencilBuffer nicht einlesen.
Daher könntest du die Objekte einfach auf einem gesonderten Rendertarget markieren:

- Zuerst alles wie gehabt auf ein Rendertarget rendern (oder auf den
Framebuffer, den man zum Weiterverwenden auf eine Textur kopiert - kann ich nur empfehlen, weil man da dann auch AntiAliasing richtig auflösen kann)
- Dann alle Objekte die geblurrt werden sollen auf ein extra Rendertarget rendern (8bit reichen aus)
- in einem Postprocessing beide Rendertargets einlesen und nur an den im zweiten markierten stellen blurren

Damit könnte man sogar noch die Intensität festlegen
Sowas wird afaik auch gern für Hitzeflimmern usw. gemacht :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

03.01.2010, 10:59

Naja da könnte man alles mögliche machen, je nachdem was genau du haben willst. Du könntest die Objekte und ihre z-Werte in extra Targets rendern, in eines die Farbe, in ein zweites die Tiefe. Dann die Farbe bluren und an die entsprechende Stelle in den Backbuffer malen, dabei im Shader die korrespondierenden z-Werte aus dem Tiefen-Target ausgeben. Das ist allerdings vermutlich nicht so einfach wie sich das anhört, da du da sehr aufpassen musst wie du die Objekte renderst damit du es nacher richtig in die restliche Szene einfügen kannst (Perspektive und Tiefenwerten müssen stimmen, etc.)

Wenn du nur einfach den Backbuffer an markierten Stellen blurst is das zwar sehr einfach, hat aber den Nachteil dass die Umgebung in die Objekte "hineingeblured" wird (bleeding).

Ich würds so machen: Du renderst zuerst einmal alles normal (die zu blurenden Objekte kannst du dabei theoretisch auslassen denk ich). Dann setzt du ein zweites Rendertarget das genausogroß ist wie der Backbuffer und renderst in das nur die Objekte die geblurred werden sollen, dabei ist das schreiben in den z-Buffer aus (nicht aber den z-Test! Du verwendest den "alten" z-Buffer wieder). Dann solltest du alles richtig in deinem zweiten Target haben, das kannst du jetzt bluren und dann auf den Backbuffer blenden.

the[V]oid

Alter Hase

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

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

6

03.01.2010, 16:28

Zitat von »"dot"«

Ich würds so machen: Du renderst zuerst einmal alles normal (die zu blurenden Objekte kannst du dabei theoretisch auslassen denk ich). Dann setzt du ein zweites Rendertarget das genausogroß ist wie der Backbuffer und renderst in das nur die Objekte die geblurred werden sollen, dabei ist das schreiben in den z-Buffer aus (nicht aber den z-Test! Du verwendest den "alten" z-Buffer wieder). Dann solltest du alles richtig in deinem zweiten Target haben, das kannst du jetzt bluren und dann auf den Backbuffer blenden.


Das hört sich gut an. Habe da nur ein Problem mit:
Warum mache ich Z-Writing aus? Damit verhindere ich doch, dass die geblurten Objekte, falls sie sich gegenseitig überlappen, korrekt dargestellt werden?
Oder welchem Zweck dient das?
<< an dieser Stelle ist eine Signatur verstorben >>

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

03.01.2010, 19:26

Zitat von »"the[V«

oid"]Das hört sich gut an. Habe da nur ein Problem mit:
Warum mache ich Z-Writing aus? Damit verhindere ich doch, dass die geblurten Objekte, falls sie sich gegenseitig überlappen, korrekt dargestellt werden?
Oder welchem Zweck dient das?


Aso sry, wenn du die geblurten Objekte im ersten Pass nicht mitrenderst musst dus im zweiten natürlich an lassen^^

Werbeanzeige