Fog of War, mit oder ohne Shader

Started by cocojack, May 07, 2013, 11:14:14 PM

Previous topic - Next topic

cocojack

Da ich jetzt meine ersten Gebäude auf meiner Karte habe und meine Einheit schon bewegen kann ist mir eingefallen was das ganze so richtig cool machen würde.

Da mein Spiel aus Vogelperspektive gespielt wird kann man über die gesamte Karte sehen, also auch um Ecken. Das ist aber irgendwie doof.
Jedoch kann ich auch nicht einfach meine "Sonne" entfernen, da sonst alles Dunkel ist. (also Sonne entfernen und auf den Kopf meiner Einheit setzten).

Und bislang alle Shader Beispiele die ich gefunden haben waren für mich total unverständlich :(.

Gibt es eine Möglichkeit alles außerhalb der Line of Sight auszugrauen, und das am besten noch ohne Shader,
oder anders: ein Deutsches Tutorial zu Shadern für die JPCT-AE Engin.
(ich habe das Gefühl dass es den Schwierigkeitsgrad für mich ungemein steigert, mich in ein so komplexes Thema auf Englisch einzulesen)

EgonOlsen

Shader haben mit der Engine selber im Prinzip nicht viel zu tun. Du musst nur ihre Einbindung verstanden haben, der Rest ist unabhängig von der Engine. Die Komplexität steigt beim Einsatz von Shaders ohnehin ziemlich an...also musst du wissen, ob du das wirklich (jetzt) machen willst. Fog of War ist ein komplexes Thema, da kann ich jetzt so ad hoc auch nichts aus dem Ärmel schütteln. Ich habe für streng blockbasierte Level mal sowas ähnliches gemacht, das ohne Shader lief aber das mag für deinen Fall gar nicht anwendbar sein. Wie sieht denn so eine Szene bei dir aus und wie genau ist bei dir die Line of Sight definiert?

cocojack

Also eigentlich relativ Simpel, ich habe Mehrere Object3D die die Sicht versperren sollen.
(Eigentlich ist es in dem Spiel League of Legends sehr gut umgesetzt, soetwas in der Art hätte ich auch gerne)


[attachment deleted by admin]

cocojack

Ich habe jetzt etwas nachgeschaut wie das mit den Shadern funktioniert.

Also ich brauche dann eigentlich "nur" den Fragment Shader zu basteln, da ich ja keine Geometrie manipulieren möchte.

Für meinen Nebel bräuchte ich also die Position des Spielers auf der Karte, die Anderer Objekte auf der Karte und die Karte Selber.

Aber wenn ich einen Shader auf ein Objekt anwende bekomme ich ja nur Daten die mit ihm selber zu tun haben, also eigentlich nicht genug.

Sind das die einzigen Wege wie ich Daten in meinen Shader bekomme?
http://www.jpct.net/wiki/index.php/OpenGL_ES_2.0_support

und wie sage ich dem Objekt was wo wie bearbeitet wird?

EgonOlsen

Du kannst beliebige Daten in den Shader stopfen, auch die Positionen von irgendwelchen anderen Objekten. Das musst halt nur selber machen. Was benutzt du eigentlich, jPCT oder jPCT-AE?

cocojack

JPCT-AE und ich entwickle für mein Nexus 7

cocojack

Also mit Uniform kann ich dem Shader Werte übergeben.

Was ich dann bräuchte wäre die "uniform mat4 textureMatrix;"

In der Theorie müsste ich es ja dann so Berechnen:
Wenn das Terrain-Pixel in einer Linie bis zum Spieler-Objekt verbindbar ist, ohne dass es durch ein anderes Objekt unterbrochen wird hat es die Original-Farbe, sonst wird es Grau.
Das anzeigen der anderen Objekte auf den Ausgegrauten Feldern müssten auf Unsichtbar gesetzt werden.

Die Sachen die ich noch nicht ganz verstehe sind folgende:
-Wie bekomme ich die Aussenkoordinaten meiner Objekt3D
-Wie finde ich heraus, dass etwas auf dieser Sichtlinie Liegt

EgonOlsen

Ja, du kannst Werte als uniforms übergeben. Ob etwas auf der Sichtlinie liegt, kannst du z.B. erkennen, indem du eine Kollisionsabfrage zwischen dem Sichtvektor und dem zu betrachtenden Objekt machst. Das ist u.U. aber etwas aufwendig, wenn du viele Objekte auf diese Art betrachten willst, vor allem auf Android.
Alternativ musst du dir irgendwas anderes ausdenken. Z.B. könntest du dir ein Gitter mit einer bestimmten Auflösung erstellen. Quasi eine vereinfachte, in der Auflösung reduzierte Bitmap in der, wenn man die Szene von oben betrachtet, die Positionen von Sichtblockern als bestimmte Werte gespeichert sind. Ich mache sowas in der Art eigentlich immer, weil es viele Dinge (unter anderem auch die Wegfindung) sehr erleichtert.

cocojack

Gibt es ne Möglichkeit das während der Laufzeit zu generieren? Sprich ne Möglichkeit das Terrain Objekt nach anderen Objekten Scannen?

Die einzige Möglichkeit die mir einfallen würde ist, mit nem kleinen Objekt durch die Karte zu fahren und die Collision-Events abzufangen...