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

1

19.08.2014, 00:35

2D Lichteffekte mit Normal- / Heightmaps?

Hallo alle miteinander,

ich möchte in mein 2D Spiel, das eine isometrische Perspektive benutzt, gerne Lichteffekte einbauen.
Ich dachte daran, Normal- und Heightmaps für alle Objekte vorzurendern und dann das ganze mit Shadern in Echtzeit zu kombinieren.

1) Haltet ihr das für sinnvoll und gangbar? Ich denke bei eher einfachen Gegenständen wie Wänden etc. ist das erstmal kein großes Problem, die Normal- und Heightmaps selbst zu erstellen, wenn man die grundsätzlichen Richtungen mal auf die Reihe bekommen hat.

2) Wie rendere ich NormalMaps /Heightmaps für Charaktere? Meine Charaktere hat ein Kumpel mit DAZ-3D gerendert. Soweit ich weiß, gibt es keine Möglichkeit, damit Normal- oder Heightmaps zu erzeugen. Gäbe es wohl eine Möglichkeit, das (3D) zu exportieren und mit einem anderen (nicht 3000-EUR-) Programm zu machen? Hat da jemand irgendeine Form von Tipp für mich?

3) Das Ganze findet v. a. in "Räumen" statt, d. h. das Licht müsste jeweils durch Wände abgeschnitten werden. Ich habe einen halbwegs funktionierenden Algorithmus, der auf meinem Boden entlangläuft und quasi ein Sichtfeld als Polygon ausspuckt. Also einen Kreis, der bei Hindernissen abgeschnitten wird. Jetzt müsste ich überlegen, wie ich das mit dem Licht kombiniere.

5) Es geht rein um optische Dekoration. Bisher zeichne ich tolle Kreise, die innen hell und außen dunkel sind multiplizierend drüber. Hmm.

6) Nein, ich werde das Ganze nicht einfach in 3D machen. :)

Für Anregungen jeder Art bin ich dankbar.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

3

19.08.2014, 10:27

1) Klar, geht das. Siehe mein Spiel: http://www.splattergame.net Gibt aber auch einige andere hier im Forum.

2) Wir haben 3D-Charaktäre in 3DSMax ausgerendert. Da kann man sich Normal- und Height-Map ganz einfach ausrendern lassen, aber für korrektes Alphablending an den Rändern war dann noch eine Nachbearbeitung nötig.

DAZ kann das evtl. auch... ich habe noch nie von dem Programm gehört, aber ich vermute, sowas gibt es irgendwo. Wenn das Programm es nicht kann, kannst Du ja auch einfach einen Shader schreiben, der Weltkoordinaten-Normalen oder wasauchimmer ausrendert, und die entstehenden Bilder dann aus dem BackBuffer ziehen und in einen Texturatlas schreiben. Evtl. in vierfach größerer Auflösung oder so, damit Du sinnvolles Antialiasing bekommst.

3) Wenn Licht durch Hindernisse aufgehalten wird, nennt man das "Schatten". Das Clippen von Dreiecken gegen Hinderniskanten geht natürlich - mir fallen spontan "Thomas Was Alone", "Super Meat Boy" und einige andere Spiele ein, die das machen. Ich habe bei Splatter stattdessen einen shaderbasierenden Ansatz genommen, bei dem ich quasi die Höhen der Schattenkanten auf einer Bodentextur ausrendere und dann beim Rendern die Höhe des Pixels gegen die Höhe der Schattenkanten aus dieser Textur vergleiche.

Das habe ich auch etwas ausführlicher hier schon im Forum geschrieben, aber ich finde es grade nicht.

4) fehlt. Hrhrhr.

5) Kreise tun es natürlich auch. Schatten bekommst Du, indem Du das Quadrat mit dem Licht-Kreis gegen die Occluder clippst, wie Du unter 3) beschreibst. Ich mach das alles im Shader wie bei einem normalen Deferred Renderer.

6) Bleib bei 2D. Die Grafikerstellung in 2D mit Normal Maps und allem ist deutlich aufwändiger, das kann ich Dir sagen. Aber in 2D sind ne Menge geiler Tricks möglich, die in 3D nicht funktionieren würden oder zumindest Grafikkarten zum Frühstück fressen.
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.

4

19.08.2014, 14:31

Das ist ja schon mal Einiges, danke.

War wohl ein wenig spät gestern, deshalb die fehlende 4.
Und ich habe auch nicht wirklich deutlich gemacht, dass es ein isometrisches Spiel ist, also quasi eine Pseudo-3-D-Perspektive.

Während ich dank eurer Antworten ganz zuversichtlich bin, was den Shaderkram angeht, scheinen mir die Begrenzungen (bzw. die Schatten ;) ) das eigentliche Problem darzustellen.
Bei den von Schrompf genannten Titeln gibt es ja keine Pseudo-3D Oberflächen, sondern die Perspektive ist entweder flach von oben oder flach von der Seite... Wenn ich bei mir Sichtbarkeit auf dem Boden lang verfolge, sind die entsprechenden Wandflächen natürlich nicht beleuchtet bzw. die Flächen, die eigentlich Licht verdecken sollten, werden fälschlicherweise quasi von hinten "beleuchtet".
Daher: Gibt es isometrische Spiele, die so etwas anwenden? Wie könnte man da vorgehen?

Ich hatte z. B. bei Shadowrun Returns (das ich nicht gespielt habe) von dem, was im Internet zu sehen war, den Eindruck, dass die Lightmaps vorberechnen und über nicht auszuleuchtende Flächen einfach schwarze Rechtecke im Editor drüberlegen. Es gibt also keine In-Engine Schatten. Kann mich aber auch irren.
Sonst kenne ich von früher noch Nox, das eine Art Licht + "Schatten" hatte.

Fällt dazu jemandem was ein?

idontknow

unregistriert

5

19.08.2014, 17:12

Bei einer Top-Down Perspektive ist der Ansatz ziemlich straight-forward, deswegen ist es in der THeorie eigentlich ganz simpel (in der Praxis auch, aber wie so oft kommen dann unzählige mini Sachen die das ganze teils etwas trickreich machen).

Zu der Isometrischen perspektive kann ich nur Vermutungen anstellen, aber da du den Lichtstrahl theoretisch 3-dimensional im isometrischen Raum verfolgen müsstest was aber denke ich nicht funktioniert weil der 3D Effekt ja nur hingetrickst wird, kann ich mir schlecht vorstellen, dass der Ansatz so auch bei einem isometrischen Spiel angewendet werden kann..

Die "einfachste" Art von Schatten ist natürlich über Blending einen schwarzen Shape über die unbeleuchtete Fläche zu rendern, aber einfach heißt natürlich nicht gut. Bei dem erwähnten Ansatz hast du eben Pixelgenauen Schatten bei sehr guter Performance, das macht das ganze lukrativ. Mit entsprechenden Height und Normalmaps kannst du damit einen sehr sehr guten 3-dimensionalen Effekt erzeugen. Was noch ein paar "einfachere" Bilder angeht kannst du auch gerne mal hier kucken:
[Devlog] 2D Beleuchtung

Splatter ist dann aber doch ein sehr gutes Beispiel, wie das ganze ausschaut, wenn man es gut umsetzt!

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

19.08.2014, 18:15

Danke für den Devlog-Link! Ich würde halt auch im Isometrischen so eine bodenbasierende Schattentechnik probieren. Im Isometrischen hast Du damit halt keine einzelnen Pixel mehr, sondern senkrechte Säulen, die sich jeweils einen Schattentexel teilen, aber ich sehe da erstmal kein Problem. Die Schatten dürfen halt nicht sofort mit der Wand beginnen, sondern erst etwas weg von der Lichtquelle. Das könnte man mit einem minimalen Offset aber problemlos erledigen. Und dafür bekommst Du dann alle Vorteile dieser Technik: schnell, weiche Kanten, hübsche Schattenkanten auch für kleine Objekte wie Steine auf dem Boden, bequeme Penumbra Regions... selbst der Trick für die indirekte Beleuchtung in Echtzeit sollte im Isometrischen noch ganz gut gehen.
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.

idontknow

unregistriert

7

19.08.2014, 19:11

Wofür Danke :p
Hab leider lange nicht mehr weiter gemacht, das Chaos im Code ist einfach zu krass, alles in einer einzigen Klasse - 2 Dateien und sind sicherlich 2000 Zeilen Code. Für mich schon relativ heft, für die Realität vermutlich lächerlich!
Was ich zuletzt noch ausprobieren wollte war das Licht nicht über simple Addition / Multiplikation der Farbe mit dem Lichtwert zu berechnen sondern in einen Farbraum (hatte HSV angedacht) zu gehen und den Lichtwert ausschließlich mit Lightness der Farbe zusammen zu rechnen, denke das sollte deutlich bessere Ergebnisse geben! Wie hast du das eigentlich in Splatter gemacht? So wie ichs jetzt verstanden habe hast du ja doch einen etwas anderen Ansatz gewählt als ich und in der "Lightmap" pro Pixel die Höhe der Lichtstrahlen festgehalten?
Kannst du deinen Ansatz vllt. nochmal in 3-4 Sätzen beschreiben?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

8

19.08.2014, 21:13

2) Wir haben 3D-Charaktäre in 3DSMax ausgerendert. Da kann man sich Normal- und Height-Map ganz einfach ausrendern lassen, aber für korrektes Alphablending an den Rändern war dann noch eine Nachbearbeitung nötig.
Ich habe deswegen mal ein Max-Plugin geschrieben, was mir den Kram gleich richtig exportiert. ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

9

19.08.2014, 21:20

Hmm, ich weiß nicht, ob das bodenbasiert funktioniert.
Meine Grafik ist auch nicht isometrisch, sondern es ist eine merkwürdige Perspektive Marke Eigenbau, entschuldigt die Verwirrung.

Zur Illustration zwei Bilder.
Die "Licht"-Darstellung im ersten Bild ist natürlich Unsinn. Das richtet sich jetzt ganz einfach nach der Kollision. Ich hatte irgendwann für einen anderen Zweck damit herumgespielt.
Aber man sieht einigermaßen, wo die Probleme liegen, denke ich.
Das andere Bild nur als Referenz.

Richtige Schatten von Tisch und Vase sind natürlich in 2D nicht drin. Die würden dann sicherlich einfach auf "durchlässig" gestellt werden. Aber die Beleuchtung in den jeweiligen Räumen zu halten, wäre durchaus sinnvoll...



10

22.08.2014, 13:00

Hat keiner eine Idee?
Ich habe leider keine Erfahrung mit Shadern.
Vielleicht könnte man ja eine Textur mit den Boden-Koordinaten aller Pixel rendern und dann die Zugehörigkeit zu dem vorgegebenen Lichtquellen-Boden-Polygon im Shader abfragen oder so? Eigentlich bräuchte man doch keine extra Textur rendern, sondern könnte die Boden-Koordinaten auch im Shader jeweils aus der Heightmap ausrechnen. Dann müsste man das allerdings für jede Lichtquelle machen...
Ich denke eine rein shaderbasierte Lösung würde nicht funktionieren, oder? Also die Ausdehnung des Lichts am Boden müsste ich schon vorher per Polygon vorgeben.

Wenn man sich an der Beleuchtung des Bodens ausrichten würde, dann hätte man zumindest "Schatten" deren Kanten nach oben stets senkrecht stehen würden. Das ist vielleicht nicht optimal, da unrealistisch, aber besser als nichts...

Leider habe ich im Moment wenig Zeit, weiter zu experimentieren, daher dachte ich, ich könnte mir ein paar qualifizierte Meinungen einholen, bevor ich da ewig vergeblich rumlaboriere. :)

Werbeanzeige