Ich arbeite an einem einfachen 2D-Spiel mit direct3d 9. Es ist ein isometrisches Spiel mit Diamantplättchen und einer versetzten Karte. Das habe ich:
Wie Sie sehen, habe ich eine Art Nebel, der durch eine Nebelmatrix ergänzt wird, die wahr (klares Gelände) oder falsch (obskurer Terraner) ist. Aber das Ergebnis ist sehr klobig. Der Nebel bewegt sich, während sich der Spieler um Kacheln bewegt, aber nicht um Pixel. Grundsätzlich überprüfe ich für jede Fliese, ob es Nebel gibt, wenn ja, ändere ich einfach die Farbe dieser Fliese:
D3DCOLOR tile_color = 0xffffffff;
if(scene->fog[i+mapx][j+mapy] == FOG_NONE) { tile_color = 0x666666FF; }
g_pSprite->Draw(texTilesNew,&rect,NULL, &D3DXVECTOR3(pantx,panty,0.0f), tile_color);
Wo der Parameter tile_color ist:
Eine Farbstruktur. Die Farb- und Alphakanäle werden durch diesen Wert moduliert. Der transparente Wert behält die ursprüngliche Quellfarbe und die Alpha-Daten bei.
Ich möchte auch, dass der Nebel glatter wird, dafür habe ich dieses "Tutorial" befolgt, aber ich habe es nicht geschafft, es herauszufinden, weil ich denke, dass das Tutorial eine andere Art von Nebel implementiert als ich.
http://www.appsizematters.com/2010/07/how-to-implement-a-fog-of-war-part-2-smooth/
Antworten:
In Ordnung, die Frage ist viel komplexer geworden, daher werde ich meinen Kommentar zu einer Antwort aufrüsten.
Es gibt viele Möglichkeiten, das zu tun, was Sie tun möchten. Je genauer Sie Ihre Beleuchtungsberechnungen wünschen, desto komplexer wird das Programm. Ich rate Ihnen daher, sich darauf zu konzentrieren, es einfach zu halten, und mehr Zeit darauf zu verwenden, dass das Spiel Spaß macht, anstatt sich auf technische Details zu beschränken.
Aber wie auch immer, hier sind einige Methoden, die ich mir vorstellen kann, um das zu erreichen, was Sie wollen:
Machen Sie die Beleuchtung als Nachbearbeitungseffekt! Sie werden nicht glauben, wie häufig diese einfachen Ansätze in AAA-Spielen verwendet werden. Fügen Sie ein schwarzes Sprite hinzu, das sich über den gesamten Spielbereich erstreckt und in der Mitte ein transparentes Loch aufweist. PNG und DXT unterstützen 8-Bit-Alphas, sodass Sie es so reibungslos gestalten können, wie Sie möchten. Der Hauptnachteil ist, dass die Form des Schattens meist statisch ist. Sie können einige interessante Tricks machen, indem Sie mit der Perspektivmatrix herumspielen, aber es ist kaum optimal.
Wenn Sie die Beleuchtung für jede Kachel separat berechnen können, multiplizieren Sie die Sprite-Farbe mit der Schattenstufe auf jeder Kachel oder überlagern Sie eine schwarze Kachel mit dem Alpha-Wert, der auf die Schattenstufe für jede Kachel festgelegt ist. Der Hauptnachteil besteht darin, dass Sie die Abweichungen zwischen den Kacheln leicht bemerken, wenn die Kacheln zu groß sind oder wenn der Schattenbereich zu klein ist. Dies ist übrigens das, was sie in vielen Ultima-Spielen getan haben.
Anstatt die Beleuchtung für jede Kachel zu berechnen, berechnen Sie sie für die Ränder und lassen Sie die Grafik-Engine die Beleuchtung über jede Kachel interpolieren. Legen Sie dazu die Farbe für jeden Scheitelpunkt Ihres Sprite-Netzes fest und legen Sie fest
SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD)
. Das Hauptproblem bei dieser Lösung tritt bei sehr hellen Lichtern mit sehr kurzen Ausbreitungen auf. Möglicherweise bemerken Sie einige Artefakte in der Nähe des Zentrums.Eine viel komplexere Lösung wäre die Berechnung der Beleuchtung pro Pixel. Dazu können Sie die Position Ihres Players als Konstante für Ihren Pixel-Shader festlegen, an dem Sie die Beleuchtungsberechnung durchführen. Dies ist auf die Pixelebene genau, erfordert jedoch, dass Sie Ihre Grafikpipeline auf die programmierbare ändern (falls Sie die feste Pipeline verwenden). Das ist relativ komplex. Das Hauptproblem bei dieser Lösung (und allen anderen oben genannten) besteht darin, dass sie keine Schatten unter der Kachel betreffen. In welchem Fall...
Sie können die Beleuchtung auch manuell implementieren. Das ist wirklich komplex und nicht für schwache Nerven, aber auch sehr lustig. Es gibt unzählige Ansätze, um dies zu tun. Sie können also anfangen, Prof. Google etwas in Anlehnung an "2D Dynamic Lighting" zu fragen.
Viel Glück mit deinem Spiel.
quelle
g_pSprite
aussehen, aber wenn es sich lediglich um zwei mit 2D-Perspektive gezeichnete Dreiecke handelt, können Sie Option 3 einfach implementieren, indem Sie für jeden Scheitelpunkt unterschiedliche Farben festlegen. Aber wenn Sie ein Anfänger sind, ist Direct3D vielleicht zu überwältigend. Warum probieren Sie nicht eine einfachere Engine aus, damit Sie alle Details einer Grafik-Pipeline verstehen, bevor Sie in Direct3D eintauchen, was möglicherweise absichtlich unnötig schwierig zu bedienen war? Eine einfache Frage: Haben Sie dieses Programm geschrieben? oder kopieren Sie eine Art Beispielcode?D3DXCreateSprite( g_pD3DDevice, &g_pSprite );
und lade dann alle notwendigen Texturen mitD3DXCreateTextureFromFileEx
. Ich nehme an, es sind alles Quads, aber ich bin mir nicht sicher. Und ja, es ist mein Programm.Hier ist ein einfacher Vorschlag: Sie können versuchen, die Nebelintensität für jede Zelle zu modulieren. Hier ist ein Beispiel für die Anwendung eines einfachen Faltungsfilters:
quelle
tile_color
, aber wie wirkt sich das wirklich auf das Rendering aus?Draw
Methode zu werfen ?Anstatt Boolesche Werte in Ihrer Nebelmatrix zu speichern, können Sie Gleitkommawerte speichern. Dies würde die Nebelmenge auf jeder Kachel zwischen 0 und 1 darstellen. Mischen Sie dann einfach Ihre Farbe in Abhängigkeit von der Nebelmenge der Kachel:
Es gibt wahrscheinlich mehrere Möglichkeiten, diese Nebelmatrix zu erzeugen, aber eine Möglichkeit, die ich mir vorstellen kann, ist:
BEARBEITEN
Ich bin mir nicht sicher, ob dies notwendig sein wird (dies ist einfach eine künstlerische Entscheidung), aber wenn Sie möchten, dass sich die Nebelmenge direkt mit den Bewegungen des Spielers ändert, müssen Sie diese Nebelmatrix unter Verwendung direkter Abstände vom Spieler generieren. Wenn Sie beispielsweise einen einfachen Nebelkreis wünschen, können Sie dies für eine Kachel bei (i, j) in Ihrer Nebelmatrix tun:
BEARBEITEN 2
Das ist, wenn Sie einen "gekachelten" Nebel halten wollen. Das Überlagern eines durchscheinenden Bildes, wie es von Panda Pyjama in seinen Kommentaren vorgeschlagen wurde, ist möglicherweise eine viel einfachere Lösung, führt jedoch zu einem anderen Ergebnis. Auch dies ist eine künstlerische Entscheidung, die Sie treffen müssen.
quelle