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

22.09.2014, 01:05

Verständnisproblem Alphabending / Backface-Culling

Hallo,

Ich verstehe nicht, wieso man bei den Übungsaufgaben zum Thema Alphablending aus Kapitel 2 die Modelle in 2 Schritten rendert?
Wieso sollte man zuerst die Rückseite und direkt darauf die Vorderseite rendern (Über den D3DR_CULLMODE Renderstate)?

Ich hätte gedacht, dass man einfach Backface-Culling abschaltet über die Render States, dadurch wird doch sowieso jedes Dreieck gezeichnet.
Wieso sollte ich also 2 Render-Aufrufe machen (Für Hinter + Vorderseite), anstatt es einfach in einem Rutsch zu machen?

Liebe Grüße
Ombalat

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

22.09.2014, 06:38

Wenn Du Backface-Culling einfach nur abschaltest, dann renderst Du eventuell die weiter hinten liegende Fläche über die bereits gerenderte vordere Fläche. Dass das dann falsche Ergebnisse liefert, dürfte klar sein. Falls nicht, mach's einfach und dreh das Teil. Dann wirst Du manchmal genau dieses Verhalten bekommen und sehen, dass das Mist ist.
Einfaches mathematisches Beispiel:
Du hast alle Flächen mit 25% Alpha (also zu 25% lichtdurchlässig). Nun renderst Du zuerst die fordere Fläche. Noch sieht's ok aus. Jetzt renderst Du die hintere teilweise drüber, womit die eigentlich vordere nur noch zu 18.75% (75%*25%) sichtbar ist und die eigentlich hintere zu 75%. Das is natürlich verkehrt. Du könntest hier die Flächen von hinten nach vorn sortieren und dann ohne Backface-Culling rendern. Das funktioniert aber nur bedingt gut. Wird zwar teilweise benutzt, aber wie entscheidet man über die Sortierung von Polygonen? Die sind ja keine Punkte im Raum, sondern Flächen, womit ihre Z-Position nicht eindeutig ist. Das führt zu Problemen in der Sortierung, bzw. zu teilweise sehr unhübschen Ergebnissen, die man so richtig nicht vermeiden kann. Zudem ist Sortierung meist zeitlich aufwendiger (dauert also eventuell Länger) als das Modell einfach zweimal auf der GPU rendern zu lassen. Es kann natürlich auch schneller sein, dann bleibt aber das Problem mit der teilweise inkorrekten Tiefen-Sortierung.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »BlueCobold« (22.09.2014, 06:45)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

3

22.09.2014, 12:04

Ich verstehs trotzdem nicht. Wenn ich mir jetzt z.b. einen Donut in einer transparente Huelle vorstelle, dann bekomme ich doch auch mit dem geschilderten Vorgehen Unsinn raus.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

22.09.2014, 12:38

Was TGGC sagen will: Das Verfahren führt nur bei konvexen Objekten zum gewünschten Effekt.

5

22.09.2014, 18:00

Okay. danke, ich denke jetzt habe ich es verstanden.

Nochmal kurz zum Verständnis:
Also ich sortiere alle Objekte (Nicht Polygone) nach der Z-Koordinate, damit ich mal grob die Reihenfolge habe (Habe ich vorher vergessen zu erwähnen, dass die Objekte sortiert werden).
Und dann rendere ich in 2 Schritten, damit nicht unabsichtlich die hintere Seite des Objektes vor die Vorderseite gerendert wird.

Danke für die Erklärungen :)

Im Beispiel mit dem Donut würde ich das Problem nicht bekommen, weil ich ja vor den Transparenten alle vollständig opaken (richtiges Vokabular?) Objekte rendere und erst danach mich um Alpha-Blending mit dem Verfahren kümmere

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

6

22.09.2014, 18:11

Nein, der Donut ist konkav, darum funktioniert das mit den Vorder- und Rückseiten nicht.
Es kann dort nämlich pro Pixel zwei Vorder- und zwei Rückseiten geben. Bei konvexen Objekten (Kugel, Quader, Zylinder, ...) passiert das nicht.

7

22.09.2014, 18:21

Achso, ich verstehe :D

Wie würde man dieses Problem dann bei konkaven Objekten lösen?
Oder kommt das noch später noch im Buch :)

8

23.09.2014, 16:07

Das ist eine Frage, die leider noch niemand wirklich eindeutig, verbindlich und mit einer perfekten Lösung beantworten konnte. Weiterhin ist das schon sicher fortgeschrittener, als Kapitel 2. ^^
Es gibt verschiedene Methoden. Darunter Depth-Peeling. Aber diese sind äußerst Performance-hungrig und sind nahezu unbrauchbar im Echtzeitrendering.

Ausschließlich auf der GPU und mit nur einem Pass lässt sich sowas sehr schwer (wenn überhaupt) realisieren.
Eine Möglichkeit wäre es, für statische Objekte einen BSP oder AABB-Tree vorzugenerieren und anhand diesem, die Polygone einzeln (oder in minimalen Gruppen) zu rendern, wenn man sie vorher entsprechend der Kameraorientierung ausrichtet. Nachteil dieser Methode ist, dass sie sehr viele einzelne DrawCalls umfasst und die Leistung der GPU nahezu überhaupt nicht ausnutzt. Weiterhin funktioniert das nur für statische Objekte performant. Bei dynamischen müsste man dauerhaft den Tree modifizieren bzw. neu Berechnen.
Eine weitere Möglichkeit ist, mithilfe eines (oder ggf. mehrerer) Screenspace passes, die Polygone in mehrere (MRTs) Depth-Buffers ("Layer") zu sortieren. Anschließend kann man mithilfe dieser MRTs die Polygone sortiert rendern. Vorteil davon ist, dass es die GPU-Rechenleistung nutzt und keine Vorberechnung benötigt. Somit sind auch dynamische Objekte möglich.

Letztendlich sollte man sich aber die Frage stellen, ob das alle notwendig ist und in welchen Fällen solche Semi-Transparenten Objekte mit konkaver Form vorkommen. Fensterscheiben sind flach. Eine Wasseroberfläche ist konvex. Eine gläserne Teekanne oder ein transparenter Donut ist mir bis jetzt in Spielen noch nicht über den Weg gelaufen :)
EnvisionGame(); EnableGame(); AchieveGame(); - Visionen kann man viele haben. Sie umzusetzen und auf das Ergebnis stolz zu sein ist die eigentliche Kunst.

9

23.09.2014, 18:28

Alles Klar, danke für die nette Erklärung :)

Werbeanzeige