Main Menu

Alpha-Blending

Started by Slartibartfast, January 12, 2008, 07:36:22 PM

Previous topic - Next topic

Slartibartfast

Zunächst mal ein großes DANKE für jPCT - in der kurzen Zeit, die ich bislang damit gearbeitet habe, hab ich gute Erfahrungen mit der Engine und dem Software-Renderer gemacht! Ich benutze die Engine als Grundlage für einen Online-Modelviewer auf der WoW-Datenbankseite http://www.speedydragon.de - zum Beispiel hier: http://www.speedydragon.de/item?id=30909#t=3.

Vor allem gefällt mir dabei die problemlose Integrationsmöglichkeit durch den Software-Renderer, der eben den Vorteil hat, unabhängig von der Grafikkarte eines Systems oder irgendwelchen nativen Bibliotheken und optisch nahtlos als Applet in die Website integriert laufen zu können. Nur eins ist sehr schade: der Software-Renderer hat leider keinen Support für Alpha-Blending :( teiltransparente Texturen werden folglich komplett opak dargestellt.

Gibt es da irgendwelche Pläne, diese Funktionalität auch in den Software-Renderer zu bringen? Im OpenGL-Renderer scheint es ja zu gehen, wenn ich diverse Foreneinträge richtig verstanden hab. Nur hat der eben den Nachteil, dass man da wieder native Bibliotheken braucht, um überhaupt an die Hardware greifen zu können - ist also eher was für Webstart-Applikationen, die außerhalb des Browsers laufen. Es wäre traumhaft, wenn auch der Software-Renderer mit teiltransparenten Texturen umgehen könnte ;D (schlag ich mal so ganz naiv vor, ohne den sicher hohen Entwicklungsaufwand für sowas wirklich einschätzen zu können - irgendeinen Grund muss es ja geben, dass es bisher keinen einzigen Java-Software-Renderer gibt, der das vernünftig beherrscht)

EgonOlsen

#1
Also du kannst schon eine Art Transparenz im Software-Renderer erreichen, sie ist nur nicht so flexibel wie unter OpenGL. Du kannst auf dem transparenten Objekt (Transparenz ist pro Objekt in jPCT, d.h. wenn du Teile eines Objektes (z.B. die Fenster eines Autos) transparent haben willst, musst du irgendwie teilen) z.B. ein setTransparency(0); machen. Damit bekommt du die größt mögliche Transparenz, was im Software-Modus etwa 50% ist. Alle nicht-schwarzen Teile der Textur werden dann so mit dem Hintergrund verrechnet, alle schwarzen sind sowieso komplett durchscheinend. Was im Software-Modus nicht geht, ist einen Alphakanal direkt aus der Textur zu nutzen, d.h. die Teile der Textur können nicht unterschiedlich durchlässig sein. Hilft das? Vielleicht hast du ein Beispiel, wo etwas transparent sein soll, damit ich besser verstehe, was genau du meinst!?

P.S.: Wenn du Speicherprobleme hast (habe ich im Text unter dem Viewer gelesen), kannst du mal (sofern noch nicht geschehen) Config.saveMemory=true; setzen. Am besten vor allen anderen Aufrufen von jPCT. Vielleicht entspannt das die Situation ein wenig.

Slartibartfast

Das mit dem Alphakanal wäre exakt die Art von Transparenz, die ich bräuchte ;) Die Transparenz über setTransparency hab ich ausprobiert, das Ergebnis war aber in meinem Fall nicht wirklich ansprechend, weil ich eben Transparenz hauptsächlich für Effekte bräuchte, wo Texturen mit Transparenzverläufen vorherrschend sind. Ein sehr einfaches Beispiel wär dieses Modell: http://www.speedydragon.de/item?id=28771#t=4. Die schwarzen Flecken sind normalerweise nach außen hin immer stärker transparent und billboarded (wobei das kein Problem wäre, aber es ist ohne die Transparenz eher störend, daher abgeschaltet).

Config.saveMemory=true ist schon gesetzt ;D Die Speicherprobleme rühren eher davon her, dass die Java-VM aus irgendeinem Grund manchmal nicht wirklich alle Register beim Aufräumen alter, deinitialisierter Applets zieht und vorschnell den OutOfMemoryError wirft, obwohl sie nur Reste von alten Applets aufräumen müsste (kann man in der Java-Konsole dann beobachten, indem man einige Male hintereinander den GC manuell auslöst - plötzlich sammelt die VM dann doch wieder das alte Zeug ein und hätte anschließend genug Speicher). Das ist mir aber auch bisher erst ein- oder zweimal beim Testen begegnet, deswegen dieser Hinweis, falls das irgendwo mal auftreten sollte. Im Normalfall reicht der Speicher dicke aus.

EgonOlsen

Ein Alphakanal würde nicht wirklich was bringen in diesem Fall, weil das Blending selber immer noch so wäre, wie es jetzt ist, d.h. dunklere Bereiche sehen auch in der Transparenz dunkel aus und verlieren sich nicht in der Hintergrundfarbe. Was dir vermutlich eher helfen würde, ist additives Blending, was in jPCT 1.15 aber nur der OpenGL-Renderer kann. Aber diese Version hier, die kann das auch in Software: http://www.jpct.net/download/beta/jpctapi116pre5.zip (mittels Object3D.setTransparencyMode(<int>) aktivieren).
Allerdings müsstest du dich von dem (fast) weißen Hintergrund verabschieden, denn weißer als weiß wird es nicht, d.h. man kann auf weiß kein grünes Zeugs draufblenden, ohne das es dunkler wird und das soll es ja nicht. Also ich würde mal obige Version (die leider nicht für 1.1 kompiliert ist...also wenn das wichtig ist, das kann ich erst am nächsten WE nachliefern) ausprobieren, den Hintergrund auf Schwarz setzen und additives Blending aktivieren. Vielleicht funktioniert das besser... ???

Slartibartfast

#4
Cool, vielen Dank! Das additive Blending mit der 1.16er-Version tut tatsächlich den Job. Du hattest Recht damit, dass in dem Fall additives Blending nötig ist.

Mit diesem Blending kann ich sicher schon mal das eine oder andere realisieren, was zuvor nicht möglich war. ;D Und es sieht sogar noch dann ordentlich aus, wenn man den hellgrauen Hintergrund belässt.

Darf ich mir trotzdem die Frage erlauben, ob du planst, in zukünftige Versionen von jPCT noch weitere Blending-Features einzuführen, insbesondere auch in den Software-Renderer? Dein Paket ist jetzt schon ganz oben dabei wenns um reine Java-Renderer geht (und ich hab einige ausprobiert...), aber eine OpenGL-ähnliche Unterstützung der diversen Blending-Modi in Software wär der absolute Hammer. Dass es prinzipiell möglich ist beweist ja das neue additive Blending schon mal sehr eindrucksvoll.

EgonOlsen

Konkret geplant habe ich da eigentlich nichts. Mit dieser Änderung kann der Softwarerenderer in etwa das, was auch der Hardwarerenderer in Punkto Transparenz kann (im Ergebnis leicht anders und nicht so flexibel, aber immerhin). Die ganzen zusätzlichen Blendings machen meiner Ansicht nach nur bedingt Sinn. Der OpenGL-Renderer unterstützt sie auch nur für Multi-Texturing, nicht für Transparenz.
Im Prinzip kann man dem Softwarerenderer natürlich noch mehr "zumuten", aber schneller wird der dadurch auch nicht. Das additive Blending dürfte bereits eine Spur langsamer sein als das alte...auf aktuellen Systemen aber vielleicht nicht wirklich schlimm.
Also wenn du wirklich konkreten Bedarf an einem Modus hast, lass es mich wissen. Dann kann man immer noch sehen, ob das kurzfristig zu ergänzen ist.

Kann man die neue Version schon Online bewundern? Ich würde gerne zwei Screenshots machen und die Sache auf der Projects-Seite ergänzen.

Slartibartfast

#6
Jap, ist seit heute morgen online. Du musst evtl. Java seinen Cache löschen lassen um sie zu sehen, weil die Java-VM Applets offenbar in nem vom Browser-Cache unabhängigen Verzeichnis zwischenspeichert (zwar nur für einen Tag, wenn sie sich an meine Cache-Angabe im HTTP-Header hält, aber immerhin...). Ein Link auf deine Page ist jetzt auch bei den ganzen anderen "Powered By..."-Bildchen auf meiner Seite drin :D

Was ich noch nicht drin habe ist Billboarding, denn da muss ich noch etwas tricksen bei der Umwandlung aus dem WoW-Modellformat in Object3D-Instanzen, damit das korrekt funktioniert. Die Transparenz ist aber aktiviert und sieht gerade z.B. bei dem oben verlinkten Modell schon sehr ordentlich aus.

Falls ich noch Bedarf an nem Blending-Modus hab, werd ich mich an dich wenden ;D jetzt werd ich erst mal sehen was sich mit dem additiven so alles umsetzen lässt. Das dürfte vermutlich sogar für ne weitestgehend originalgetreue Darstellung diverser Partikeleffekte, die manche Waffen haben, ausreichen. Danke auf jeden Fall mal soweit!

P.S.: Wird der Software-Renderer auch langsamer durch das bloße Vorhandensein von additivem Blending (wenn man es aktiviert ists klar, aber gesetzt den Fall man aktiviert es nicht)?

EgonOlsen

Nein, das Vorhandensein ist egal. Es geht nur um die Benutzung.

EgonOlsen

#8
Den Java-Cache hatte ich schon gelöscht, nur den Browser-Cache nicht. Ich musste offenbar beide löschen, nun geht's. Sieht gut aus! Überhaupt finde ich die ganze Seite schön gelungen mit den Menüs und so. Steckt viel an Informationen drin und trotzdem bleibt es übersichtlich. Und es ist endlich mal nicht mit PHP gemacht... ;)
Ich habe mir erlaubt, einen Link von der Projects-Seite aus zu setzen: http://www.jpct.net/projects.html

P.S.: Evtl. wäre es zur Entlastung von Single-Core-Maschine sinnvoll, die CPU-Last etwas zu begrenzen? Also entweder auf eventbasiertes Zeichnen umstellen oder (was wohl in deinem Fall weniger Aufwand ist), einfach ein Thread.sleep(10); immer dann in der Schleife ausführen, wenn für eine kurze Zeit gerade kein Mausevent eingetrudelt ist. Ist nur ein Vorschlag, aber gerade auf älteren Kisten kann sich der Browser sonst etwas sehr träge benehmen, wenn die CPU volle Kraft am Applet malt, obwohl sich dort ja eigentlich gar nichts drin verändert.

P.P.S.: Manche transparenten Texturen wirken auf mich so, als wenn sie tatsächlich (ursprünglich?) einen Alphakanal enthalten, weil sie nicht selber ins Schwarze ausblenden und somit als bunte Quadrate bestehen bleiben. Evtl. kann man das lösen, indem man mit pre-multiplied Alpha arbeitet, also das Bild mit Alphakanal laden, den Alphakanal mit den Pixeln verrechnen und das Ergebnis als Textur verwenden. Ist zwar ein bisschen Aufwand, aber sollte eigentlich vernünftige Ergebnisse liefern.

Slartibartfast

QuoteUnd es ist endlich mal nicht mit PHP gemacht...

Danke für das Lob ;D Von PHP-Frickelei (Frickelei, weil 90% der PHP-basierten Seiten - die meisten meiner früheren Werke eingerechnet - leider nicht anders bezeichnet werden können, obwohl man damit mittlerweile angeblich sauber programmieren können soll) hab ich bei Projekten dieser Größenordnung mittlerweile komplett Abschied genommen. Für das schnell hingehackte Script ist PHP gut brauchbar und man kommt schnell zu Ergebnissen, aber für alles größere lohnt sich der initial größere Setup-Aufwand bei der Arbeit mit Servlets recht bald. Und mit Java fällts zumindest mir wesentlich leichter, halbwegs vernünftig strukturierten Code zu produzieren (oder schwerer, zu frickeln - je nachdem wie man's betrachten will), vom ungleich größeren Handlungsspielraum, den man in einer "richtigen", permanent laufenden Anwendung hat, ganz zu schweigen...aber über das Thema "PHP vs. Java bei Webanwendungen" könnt ich stundenlang schreiben/diskutieren ;)


Die P.S.es enthalten beide gute Ideen, die ich sicher umsetzen werde (an letzteres hatte ich auch schon gedacht, um damit Alpha-Blending "vorzutäuschen" bei Texturen, die eigentlich mit Alphakanal-Berücksichtigung gerendert werden müssten - den Alphakanal hab ich im Applet zur Verfügung, die Umrechnung könnt ich also direkt beim Laden des Modells vornehmen).

EgonOlsen

#10
Ich habe die Animationen gesehen, die du im Devblog beschreibst. Sieht super aus! Ich denke mal, dass ist komplett selber gebaut, oder? Oder basiert das irgendwie auf dem Skeletal-Kram von Cyberkilla von der Download-Seite?

Jonas

Hab mir die Seite auch eben angeschaut..nice work :) ... auch wenn ich WoW nicht mag ;D
Simple things should be simple, complex things should be possible - Alan Kay