Hübscheres Wasser rendern
-
Hi,
für mein Wasserpartikel System hätte ich gerne ein hübscheres Rendering. Momentan benutze ich Pointsplats, die ich zusammenblende mit folgender Blendfunktion: glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA). Meine Partikel werden als GL_POINTS gerendert und dann im Pixel/Fragment Shader in Splats verwandelt. Das Problem sind die überlappenden Bereiche, weil dort der Farbwert addiert wird, was allerdings nicht besonders hübsch aussieht.
Hier zwei Bilder, einmal nah dran und einmal etwas weiter weg:
http://img515.imageshack.us/img515/7018/bildschirmfoto2o.png
http://img263.imageshack.us/img263/5489/bildschirmfoto1.pngHat jemand eine Idee wie man das Ganze auf einfache Art und Weise schöner darstellen kann?
Vielen Dank
KaPtainCugel
-
also mir gefallen die pointsplats
was genau moechtest du verschoenern? dass man die einzelnen splats nicht mehr erkennt? in dem fall wuerde ich sie nach aussen hin transparenter blenden.
-
Hi danke schonmal für den Tipp! Mit dem Abfallen des Alpha-Wertes nach aussen sieht man die Überlappungen schonmal wesentlich weniger.
Was ich so als Referenz Video habe, ist das sph.avi von folgender Seite:
http://www.matthiasmueller.info/videos/index.htm
(Abgesehen davon, dass die Videos da alle sehr geil sind.) Das SPH Video wurde zwar glaube ich mit Marching Cubes gerendert, aber er nennt in seinem Paper auch den Ansatz mit Point Splats und das sieht fast genauso gut aus (einem Bild nach zu urteilen).
-
ich glaube diese qualitaet erreichst du ohne marching cubes kaum, da er wohl raytracing verwendet hat um dann die refraction und reflection zu berechnen. mit vielen einzelnen punkten ist das kaum moeglich. du kannst natuerlich versuchen durch alle splats zu tracen und man kann davon ausgehen, dass die brechungszahl von splat zu splat gleich ist, aber mit simplen zeichnen ist das nicht wirklich zu machen.
da alle splats gleich gross sind, kannst du sie von hinten nach vorne sortiert zeichnen (falls du das nicht schon machst), weil mit deiner blendingformel die reihenfolge wichtig ist.
weiter kannst du versuchen den alphablend nach aussen hin nicht linear, sondern mit irgendwelchen kurven (z.b. ein einfaches Alpha*Alpha [0.f 1.f]) zu machen, weil die kugel-/splat-/particledichte auch nicht linear ist.
du kannst versuchen alle particle zu einer masse zu mergen indem du sie mit Z schreibst und die distanz vom z-wert vom pixel den du setzt zum momentanen z-wert noch als gewichtung auf den alpha wert rechnest. das waere aber nicht trivial mit opengl zu implementieren, in software schon eher. (stichwort "soft particles")ansonsten, kugelraytacer, sollte nicht die welt sein