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

1

09.01.2005, 14:44

ZBuffer für unterschiedlich große rendertargets stretchen

Hi,

ich hab bei meinem aktuellen projekt einige objete die "leuchten" sollen.
dies erreich ich, indem ich die entsprechenden objete auf eine textur rendere und diese dann über den bildschrim mit einem gauss-filter "drüberrender".
funktioniert auch super. nur, damit die objekte nicht durch andere objekte
"durchleuchten" muss ich die restlichen objekte auch auf die textur rendern
damir der zbuffer entsprechende werte bekommt alledings
ohne das ein pixel im framebuffer landet.
will heißen das ich alles 2 mal rendere. und das nervt mich.
meine frage deshalb: kann ich nicht theoretisch erst alles in den framebuffer
rendern mit setViewPort(0,0, BackBufferWidth, BackBufferHeight)
(=pseudocode!) und dann wenn ich auf die kleinere textur rendere
setViewPort(0,0,TextureWidth, TextureHeight) awenden und
hoffen das der zbuffer entsprechend mit gestretcht wird?
ok..etwas blöd formuliert also meine frage:
wenn man den viewport oder das rendertarget ändert, wird dann der zbuffer
mit dem viewport bzw. der größe des neuen rendertargets angepasst?
also nicht abgeschnitten sondern "gestaucht"???

thx 23h

2

09.01.2005, 16:42

Hoffen gesagt. Keine Ahnung. Aber ich denke eher weniger, da nicht klar ist wie man die Z-Werte Interpolieren sollte. Ein Stauchen oder Dehnen könnte daher zu Darstellungsfehlern führen.

Mir ist allerdings nicht 100% klar was du genau möchtest. Aber vieleicht Hilft dir ja HDR (Height Dynamic Range) weiter? Einfach mal im DX9 SDK schauen. Da gibbet eine Demo dazu.

Hat nur einen Hacken. Transparenz. Ältere Hardware (darunter auch z.B. Radeon 9600, 9700 oder auch GF5700) können kein Blending auf Floating-Point Texturen durchführen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

3

09.01.2005, 17:21

nun was ich machen will is eigentlich ganz einfach:

der status quo:
damit meine leuchtenden objekte leuchten, rendere ich sie zusätzlich zum backbuffer
noch auf eine textur und blende diese dann über den backbuffer.
dadurch kriegen meine objekte einen leuchtenden schein.
damit aber dieser auch korrekt von anderen objekten verdeckt wird
muss ich ALLE objekte zusätzlich auf die textur rendern damit eben der
zbuffer korrekt gefüllt ist.
das heißt ich muss alles 2mal rendern und das ist ja mal nich so toll.

was ich gerne machen würde:
ich render die komplette szene fertig in den backbuffer und benutzten
den nun gefüllten zbuffer mit der textur als rendertarget um meine
leuchtenden objekte zu rendern, eben ohne nochmals alles rendern zu
müssen. die zbufferwerte vom rest liegen ja bereits im zbuffer.
allerdings müsste ich natürlich den zbuffer auf die größe der textur
zusammenstauchen sonst stimmen die werte freilich nicht mehr.
und ich wollte halt nur wissen ob das überhaupt geht.

hat jemand ne andere idee für nen glow-effekt?

gruß 23h

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

09.01.2005, 18:35

also ich hab sowas schon vor langer zeit mal gemacht...
die technik nennt sich fullscreen glow oder so und is ein hdr effekt ähnlich wie ihn auch tron 2.0 verwendet.

funzt folgendermaßen:

alles was glühen soll wird erst einmal in eine textur gerendert die kleiner als der backbuffer is.
die textur kommt in eine 2. textur die so breit wie der bb is und wird daher in x richtung gestreckt.
dann wird die textur in eine 3. textur gerendert die so hoch wie der bb is und das ganze also noch in y richtung gestreckt.
beim strecken wird ein einfacher bloom filter verwendet.
dann wird die szene ohne glow in den backbuffer gerendert.
und über die szene kommt dann die 3. textur drüber...fertig

nachteil: der bloom filter drückt ziemlich auf die fillrate
angeblich solls aber irgendwie mit nebel sogar unter dx 7.0 möglich sein!?
probleme gibts hier zwar nicht mit dem zbuffer ( die texturen sind nie größer als der backbuffer ), aber mit multisampling...

1. textur ( glow )
2. textur ( gestreckt in x-richtung )
3. textur ( noch einmal gestreckt in y-richtung )
final

5

09.01.2005, 22:19

okay. das ist dann praktisch meine methode nur in mehrere
passes aufgeteil.
ich render ebenfalls auf eine kleinere textur nur
das ich die dann direkt über den bb lege mit nem gauss-blur-filter.
allerdings sieht das bei dir deutlich "schärfer" aus.
wie groß ist deine textur und dein bb bei dem bsp?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

09.01.2005, 22:24

texturgröße:

backbufferwidth/2 * backbufferheight/2

wie "scharf" es aussieht, hängt vor allem davon ab, wie viele nachbarpixel pro pixel du verwendest ( in meinem bsp. sinds glaub ich 8 )

Werbeanzeige