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

drz

Frischling

  • »drz« ist der Autor dieses Themas
  • Private Nachricht senden

1

10.11.2013, 11:38

sortieren für alpha blending.

Hallo Spieleprogrammierer,

ich stehe vor einem Problem beim Anzeigen von großen Meshes welche den Alpahchannel von Texturen für alpha blending verwenden. Das ganz wird im Schader durch den Blendstate realisiert. Nun ist natürlich das Problem, dass die einzelnen Faces in einer bestimmten Reihenfolge und in Abhängigkeit der Position zum Betrachter gezeichnet werden müssen, damit die transparenten Faces erst nach den nicht transparenten gezeichnet werden.

An sich klingt die Problembeschreibung recht einfach. Es müssen eben alle Faces sortiert werden, was mir jedoch ziemlich aufwendig und leistungs-intesiv erscheint. Meine Frage ist ob es da vielleicht einen anderen Ansatz gibt (eventuell im Shader).

Ich wäre für jeden Ansatz dankbar, der nicht die ganzen faces bei jedem draw neu sortiert.

Danke

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

10.11.2013, 13:00

So richtig schön wird das nie. Wenn das Modell es zulässt, kannst Du zuerst nur Rückseiten und dann in einem zweiten DrawCall nur die Vorderseiten zeichnen. Für konvexe Objekte klappt das prima, für alle anderen Modelle sieht es aus bestimmten Blickwinkeln immernoch Grütze aus.

Alternativ gibt es Order Independent Transparency, was aber nur die neuesten DX11-Karten bieten und was auch nicht sonderlich schnell ist. Ich würde also eher allgemein fragen, was Du eigentlich vorhast. Vielleicht findet sich ein besserer Weg, den gewünschten Effekt umzusetzen.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

drz

Frischling

  • »drz« ist der Autor dieses Themas
  • Private Nachricht senden

3

10.11.2013, 13:46

Hallo Schrompf, danke für deine Antwort. Ich versuche mein Problem näher zu beschreiben.

Nun, ich versuche Models im ASE Format zu laden. Diese Models sind nicht von mir und ich möchte sie auch nicht in einem Projekt verwenden. Es geht mir hierbei nur um den Lerneffekt. In diesem Format werden den Faces die zu verwendenden Texturen per ID zugewiesen. Das Problem ist, das wenn ich zum Beispiel eine kleine Stadt lade, dort Häuser, Mauern und Vegetation in ein und der selben Datei gespeichert sind. Diese verschiedenen Informationen sind leider nicht vor-sortiert oder mit submesh Namen versehen.

Ich zeichne zum Beispiel in dem unteren Bild einen Baum, der sich vor einer Mauer befindet. Vor dem Baum befindet sich Gräser mit einer .tga textur und alpha-channel. Es ist gut zu sehen, dass der Baum wohl zuerst gezeichnet wird da hier das alpha blending funktioniert. Aber offensichtlich wird die Mauer dahinter als letztes gezeichnet, weshalb der blaue Hintergrund zu sehen ist. Ich werde mich wohl mit dem Gedanken abfinden müssen, hier in irgendeiner Art zu sortieren. Aber das erscheint mir als sehr zeit intesniv, da es in jedem Frame gemacht werden müsste und in Abhängigkeit der Kameraposition. Kann dieses Problem wirklich mit ständigem Sortieren vor jedem draw call gelöst werden?


(Link)


Sollte mein Problem noch nicht ausreichend beschrieben sein, bitte ich um einen weiteren Hinweis. Danke.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

10.11.2013, 13:54

Ja, sortieren ist hier die gängige Lösung...

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

5

10.11.2013, 14:09

Um die Anzahl der unnötigen Artefakte zu reduzieren, kann man den Alphatest verwenden.

Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

6

10.11.2013, 14:09

Eine Alternative wäre Depth Peeling (http://en.wikipedia.org/wiki/Depth_peeling). Aber diese Methode ist sowohl bei der Implementation als auch zur Laufzeit auch recht aufwendig. Von daher ist Sortieren immer noch die gängige Lösung. Es hat nur den Nachteil, dass es manchmal keine 100% korrekt Lösung gibt, wenn man Dreiecke sortiert. Das sind dann aber wirklich Spezialfälle.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

7

10.11.2013, 17:44

Folgende Lösung ist relativ einfach und du kommst damit ziemlich weit:

Grundsätzlich gruppierst du Objekte nach transparent / nicht transparent. Evtl. würde bräuchtest du für ein Auto beispielsweise dann 2 DrawCalls, anstatt einem, weil alles was transparent ist (Fenster, Scheinwerfer) in ein extra Sub-Mesh wandert. Die nicht transparenten Objekte kannst du jetzt in beliebiger Reihenfolge Zeichnen. Damit würde zum Beispiel das Problem mit der unsichtbaren Mauer gelöst werden.
Was sehr interessant ist: Dinge wie Zäune oder Gras sind um Grunde nicht transparent. Durch den schon angesprochenen Alphatest werden unsichtbare Pixel überhaupt nicht gezeichnet, laden also auch nicht im Depth-Buffer. Damit gehst du dann nochmal unglaublich vielen Problemen aus dem Weg. Zu beachten ist, dass die Ränder von Grashalmen oft einen sanften Übergang haben (ob durch die Textur oder das Filtering beim Rendern), hier bekommst du dann wieder die üblichen Probleme. Es kann dir also passieren, dass du entlang einzelner Grashalme wieder Himmel durchscheinen siehst. Aber der ganze Rest ist korrekt, insbesondere hast du damit dann keine hässlichen, himmelsblauen Vierecke mehr.
Danach kannst du alle transparenten Objekte renden. Hier solltest du natürlich sortieren, einfach ist es auf Modell-Ebene, genauer wird es auf der Dreiecksebene und selten braucht man auch mal die Pixelebene. Aber die Frage ist, ob du jetzt überhaupt noch sortieren musst. Denn transparente Objekte sind in den meisten Szenen ziemlich selten, dass zwei davon hintereinander liegen ist dann noch seltener. Ich habe schon in dutzenden kommerziellen Spielen genau diese Fehler gesehen, weil einfach nicht sortiert wurde. Dann hast du eben in seltenen Situationen Fehler, dafür lässt es sich aber einfach programmieren und ist schnell. Gerade im Hobbybereich würde ich es also genau so machen.

Übrigens kannst du natürlich auch 3 Stufen machen: Opake Objekte (nicht transparente), teilweise opake Objekte (alles was nicht halbtransparent ist, also Gras oder Zäune) und transparente (Glas, Partikeleffekte). Dadurch würde dann beispielsweise beim Gras nicht mehr der Himmel am Rand durchscheinen, sondern maximal der Boden (obwohl eigentlich anderes Gras sichtbar sein sollte), was lange nicht so schlimm ist.

Du musst also im Grunde nur beim Rendern sehr grob auf Objektebene sortieren (du könntest z.B. 3 unterschiedliche Listen anlegen, in die zu rendernde Elemente einsortiert werden) und brauchst entsprechend angepasste Materialien. Das ist beides kein großes Problem.
Lieber dumm fragen, als dumm bleiben!

drz

Frischling

  • »drz« ist der Autor dieses Themas
  • Private Nachricht senden

8

11.11.2013, 08:12

Ich bedanke mich für die hilfreichen Antworten. Insbesondere bei dir Jonathan Klein. Der ursprüngliche Grund wegen Alternativen war dieser Link. http://gpupro.blogspot.de/2009/11/alpha-…st-process.html Alllerdings konnte ich das dazugehörige Dokument nirgendwo finden. Ich werde mich vorerst mit dem vor-sortieren beschäftigen. Vielen Dank.

Werbeanzeige