d3d - smoothe Beleuchtung / smooth shading

    • d3d - smoothe Beleuchtung / smooth shading

      Wenn ich im 3d-Modus ein pointlight erstell werden immer die ganzen Flächen (faces) beleuchtet. Die Wände sind dann z.B. heller als der Boden, da der Boden viel größer als ein einzelnes Wandsegmente gedrawt wird. Ich möchte aber eine "weiche" Beleuchtung, so dass z.B. der Boden rund um eine Lampe in einem gewissen Umkreis beleuchtet wird und das Licht mit größer werdender Entfernung zur Lichtquelle dunkler wird. Geht dass überhaupt ohne Extensions/dlls?

      edited: Nennt man das was ich meine Cellshading?

      edited zum 2. ma: Blödsinn cel shading ist dieser Comicstyle oder? Ich meine glaub ich shading. Eine weiche Beleuchtung halt wie bei den Fackeln bei Minecraft. (nein ich will keinen Minecraftklon machen)

      edited zum letzten mal: In der Hilfe steht, dass man d3d_set_shading(true) schreiben, also smooth shading aktivieren muss. Dass hab ich gemacht aber dennoch: Es werden immer die ganzen Flächen, also die ganze Wand, der ganze Boden gleicht stark beleuchtet. Muss ich die Wände und den Boden usw. in viele kleine Faces aufteilen? Oder wie? Schon mal vielen Dank für Hilfe.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Morpheus ()

    • Ein kurzer Blick in die Hilfe:

      Wenn Licht benutzt wird, wird zuerst die Farbe für jeden Vertex in einem Polygon bestimmt. Als nächstes wird die Farbe aller internen Pixel mithilfe dieser Werte berechnet. Dies kann auf zwei verschiedene Wege geschehen: Entweder bekommt das ganze Polygon die selbe Farbe, oder die Farbe verläuft weich über das Polygon (Smooth Shading). Normalerweise wird Letzteres verwendet, kann aber mit folgender Funktion geändert werden:

      d3d_set_shading(smooth) Aktiviert oder deaktiviert Smooth Shading.


      Edit: Zu spät.
    • Das Problem ist, dass das Licht nur für jeden Vertex berechnet wird. Es wird dann auf der Fläche zwischen diesen Farben interpoliert. Die Folge ist, dass es sehr detailarm wird. In GM:S kann man das Problem mit einem Fragment Shader lösen, welcher dann für jeden Pixel eigenständig die Lichtintensität berechnet. Alternativ bleibt nur noch die Möglichkeit die Fläche mehrmals zu unterteilen. d3d_set_shading(smooth) bewirkt nur, dass alle Normalen auf einem Punkt zusammengefasst werden, sodass ein runder Eindruck entsteht. Dies ist aber auch nur für runde oder organische Körper gedacht.

    • Morpheus schrieb:

      Aha ok danke. Ja in meinem Fall hab ich das jetzt so gemacht, dass ich viele kleine floors mittels for-Schleifen drawen lasse und siehe da: Es ist so wie's sein soll. Und bei Models sollgte es ja dann eh gehen.

      Sofern deine Spielwelt etwas größer sein soll als ein 10 quadratmeter großer Raum, ist das keine dauerhafte lösung.
      Insbesondere ältere GPUs werden da ziemlich schnell ausgelastet sein.

      Sowas ohne Shader spezifischen calculationen (z.B: Shadowmapping) hinzubekommen ist relativ schwer. Ältere Spiele haben aus diesem Grund für die Umgebungsbeleuchtung vorgerendere Lightmaps verwendet.
      Wenn man dann wirklich realtime Lichter simulieren wollte (z.B: eine Öllampe die der Spieler bei sich trägt) hat man auf verschiedenste Tricks zurückgegriffen.
      Wenn das Spiel von der topdown perspektive gespielt wurde (Top down dungeon crawler oder Strategie spiel,etc..), könnte man z.B: einen 2ten Framebuffer verwenden, der anfangs komplett schwarz gefärbt wird.
      Alle Koordinaten der lichter im 3D raum werden dann auf die 2D Ebene projeziert und and der stelle mit sanften Runden Formen "ausgestanzt" bzw in anderen farben (mit alphawert) gefärbt.
      Dieser licht-buffer wird dann einfach über den normalen Framebuffer gelegt.

      Wenn du dir das originale Silent-hill spiel anschaust, merkst du beim deutlicheren beobachten dass die Lichter auch auf vertexbasis berechnet werden. (Merkt man insbesondere in Räumen wo die Kamera sehr nah am Spieler und der Umgebung plaziert ist.)
      Dabei wurden aber auch sehr wenige Polygone verwendet, da die PS1 Hardware nicht High-Poly modelle verarbeiten kann. (Die Rechenpower war einfach nicht gegeben.)
      Man merkt das aber beim ersten blick nicht so ganz, da die Entwickler noch einen Fog verwendet haben (kurze renderdistanz) der in kombination mit dem Vertex-licht das finale Ergebniss lieferte.
      Der Fog hilft dabei die eine Lichtquelle an den Ecken "abzurunden" um die sonst bemerkbaren vertex-übergänge zu Verstecken.

      Ein ähnliches Prinzip habe ich damals bei "The Deep Well" angewendet. (wurde im GM8.1 gemacht > es gab keine Shader.)
      Das zentrale Spielerlicht der Kamera,Öllampe, etc... wurde mit einem Pointlight gemacht. Die welt selbst war auch nicht sonderlich hoch (von den Vertexen her gesehen) aufgelöst.
      Um das ganze ein wenig aufzupeppen habe ich das pointlight mit dem internen 3D fog-Effekt kombiniert um die Lichtübergänge an den kanten abzurunden.

      Eine "Antwort auf alle Probleme" gibt es nicht. Je nachdem was gefordert ist muss man versuchen den besten weg zu finden.

      Was du z.B: machen könntest, ist am Boden ein Quad (z.B: ein Floor) mit einem runden Kreis mit weichen übergängen) als textur zu zeichnen.
      z.B: sowas:


      Dann kannst du dieses in deiner beliebigen Farbe einfärben. Der Spieler selbst wird dann generell als ganzes in den Farbton der Lichtquelle eingefärbt.
      Die umgebung hingegen bleibt low-poly und wird mit einem pointlight beleuchtet.
      Nun, die Umgebung um den spieler herum hat zwar immernoch die hässlichen Artefakte, diese stechen dann nicht mehr so deutlich ins auge, da der Boden im großteil rund ist und die Aufmerksamkeit des Spielers großteils auf das Spielermodell gerichtet sein wird.
      > Die umgebung wird dann immernoch leicht beleuchtet, man merkt aber nicht mehr so stark dass es mit vertex-basiertem licht umgesetzt wurde.

      /Edit: Sorry für irgendwelche Rechtschreibfehler. Manchmal schreibe ich so schnell sodass meine Finger nicht mehr mitkommen XD

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von LEWA ()

    • Dank dir für deine Einführung. Das Spiel wird in der Ego-Perspektive sein aber ich werde ausprobieren, wie es aussieht wenn ich einen Lichtkreis um den Spieler als Textur auf den Boden mal, der den Sichtradius unterstreicht. Und wie es aussieht wenn ich Lichtkegel als Polygone zeichnen lasse. Was die Spielwelt betrifft: SIe wird zwar riesig aber in viele kleine Räume unterteilt sein. Lichter, Wände, Böden und Modelle die man nicht sieht werden auch nicht gezeichnet. Einen Fog werde ich auch verwenden, aber ich finde die Übergänge bei diesem Vertex-Licht gar nicht mal sooo schrecklich.

      Kann man dein Spiel "The Deep Wall" irgendwo runterladen LEWA? Ich würde mir gern ansehen wie du dass da genau mit den Licht gelöst hast.
    • Dank dir für deine Einführung. Das Spiel wird in der Ego-Perspektive sein aber ich werde ausprobieren, wie es aussieht wenn ich einen Lichtkreis um den Spieler als Textur auf den Boden mal, der den Sichtradius unterstreicht. Und wie es aussieht wenn ich Lichtkegel als Polygone zeichnen lasse. Was die Spielwelt betrifft: SIe wird zwar riesig aber in viele kleine Räume unterteilt sein. Lichter, Wände, Böden und Modelle die man nicht sieht werden auch nicht gezeichnet. Einen Fog werde ich auch verwenden, aber ich finde die Übergänge bei diesem Vertex-Licht gar nicht mal sooo schrecklich.

      Wenn die Vertexbeleuchtung für dich ausreichend ist, ist es doch ok.^^
      Was ich meinte ist, dass du die Welt nicht unbedingt jetzt zusätzlich in abertausende kleinerer Polygone unterteilen sollst, nur damit das Vertex-licht besser aussieht. Das ist ein performanceseitiges no-go.
      Stattdessen eben auf Tricks wie die Lichttextur und Fog zurückgreifen.^^

      Das Spiel kannst du übrigens HIER runterladen.

      Ich habe dir mal direkt einige Screenshots hier gepostet. Da sieht man auch ganz gut wie die Lichtübergänge ausschauen:
      (Achtung: Hohe Auflösung!)


      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von LEWA ()