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!
[XNA/HLSL] Problem mit Transparenz bei Partikeleffekt
Hi Leute,
zur Zeit arbeite ich an Partikeleffekten für z.B. die Antriebe/Düsen der Raumschiffe in meinem Projekt. Doch da ich mich mit diesem Projekt auch shadertechnisch auf Neuland gewagt habe, fehlt mir hier bei einem kleinen Problem der richtige Denkanstoß. Folgendes Problem:
Aus der Düse des Raumschiffes werden Partikel geschossen, um einen Feuereffekt zu erzeugen:
Wie man sieht, ist die Zeichenreihenfolge andersherum und die (halb-)transparenten Bereiche werden nicht transparent dargestellt, sondern überlagern den jeweils dahinterliegenden Partikel.
Ich habe bereits mit if (col.a == 0) { discard; } im Shader gearbeitet, damit habe ich erreicht, dass die Textur nicht mehr eckig gezeichnet wird, sondern nur die Bereiche mit Alpha>0, wodurch diese runde, aber leider nicht (halb-)transparente Textur entsteht.
Hat einer eine Idee, wie ich das ganze fixen kann?
PS: Ich weiß, dass die Angabe des Vektors Vector3.Forward dazu führt, dass diese Primitives nur von vorne aus sichtbar sind, da werd ich später noch den Kameravektor einsetzen, aber das ist nicht die Ursache für das Problem.
PPS: Diese Code-Autoformatierung hier im Forum ist ja schon gruselig teilweise, ne?
Die relevanten Teile des dazugehörigen Shaders (der sich als Effekt hinter dem Objekt fx verbirgt) sieht genauso simpel aus (und enthalten oben erwähnte discard-Zeile):
Ein alt bekanntes Problem.
Die Lösung des Ganzen ist es den Z-Buffer Schreibzugriff beim Rendern der Partikel abzustellen.
Dann solltest du aber entweden additives Blending verwender oder du musst die zu zeichnenden Partikel erst nach der Entfernung zu Kameraebene sortieren.
Sonst kommt es zu Farbartefakten.
Das Problem mit dem Umgehen des z-Buffers (ich habe es vorher in einem Sprite-Batch gezeichnet, da gibt es ja keinen Z-Buffer) ist, dass der Effekt dann immer "vorne" ist, auch wenn sich der Partikel hinter einem Objekt befindet :-/
Damit hatte ich auch schon beim Bloom-Effekt für die Sonnen meine lieben Problemchen, da es ein Postprocess Effekt ist...
Das mit dem Sortieren vorher erscheint mir sinnvoll, aber kostet das nicht wahnsinnig Rechenleistung?
Ich sagte auch, du sollst den ZBufferschreibzugriff abschalten und nicht den ganzen Buffer.
Wie das in Dx geht weiß ich gerade nicht auswendig. Ich glaube mich aber daran erinnern zu können, dass die Funktion(?) ZBufferWriteEnable oder so ähnlich hies.
Mit dem richtigen Sortieralgo sollte sich die Rechenleistung durchaus in Grenzen halten.
Eine korrekte Tiefensortierung der einzelnen Partikel ist z.T. gar nicht wünschenswert, weil so oft unerwünschtes "Partikel-Plopping" entstehen kann. Generell genügt es die Partikel-Effekte zu sortieren (oder die Emitter). Das Rendern ist straight forward: