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

David Mehre

unregistriert

11

06.08.2009, 12:15

Zitat von »"dot"«

Mein erster Ansatz wär: Nochmal dein Terrain oder eine entsprechend unterteilte Ebene einfach schwarz mit Vertex Color und Alpha je nach Abstand von deinen Einheiten auf nen entsprechenden Wert gesetzt drüberrendern. Wenn du irgendeinen Sichtbarkeitsalgo hast (z.B. Quadtree oder so) dann kannst du den auch einspannen um die Dinge die ganz im Fog of War (so nennt sich das normal) liegen gar nicht zu zeichnen...


Also vom Prinzip her: Ich erstelle einen zweiten Vertex-Buffer des Terrains. Diesen gehe ich in jedem Frame durch und überprüfe, ob sich der Vertex im sichtbaren Bereich befindet oder nicht. Je nach dem bekommt er eine schwarze Farbe zugeordnet, wobei der Alpha-Wert bestimmt, wie sichtbar dieser Vertex ist. Die Welt wird dann zweimal gezeichnet - einmal "normal" und einmal mit dem neuen Buffer.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

12

06.08.2009, 12:23

jo so in etwa könnt ich mir das vorstellen. Wobei die Geometrie im zweiten VertexBuffer ja auch einfach flach sein kann und nicht notwendigerweise die Höhenwerte des Terrains haben muss (kann man ja beides versuchen und schaun inwiefern das nen Einfluss hat und was besser aussieht).
Du könntest auch direkt den Nebel des Krieges aus Dreiecken zusammensetzen ohne dich am Gitter des Terrain zu orientieren und zum Schluss über alles drüberrendern...

Alternativ dazu könntest du auch die Welt direkt mit einem Alpha versehen und damit "direkt" aublenden sodass du dann halt deine Welt in der Clear Color im BackBuffer verschwinden lässt...

David Mehre

unregistriert

13

06.08.2009, 12:29

Zitat von »"dot"«

jo so in etwa könnt ich mir das vorstellen. Wobei die Geometrie im zweiten VertexBuffer ja auch einfach flach sein kann und nicht notwendigerweise die Höhenwerte des Terrains haben muss (kann man ja beides versuchen und schaun inwiefern das nen Einfluss hat und was besser aussieht).


Wieso kann die Geometrie flach sein, würde das nicht Probleme beim zeichnen geben (also beim Überdecken des zuvor gezeichneten Terrains)?

Zitat von »"dot"«

Alternativ dazu könntest du auch die Welt direkt mit einem Alpha versehen und damit "direkt" aublenden sodass du dann halt deine Welt in der Clear Color im BackBuffer verschwinden lässt...


Stimmt, das wäre auch eine Möglichkeit...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

14

06.08.2009, 12:38

Zitat von »"David Mehre"«

Wieso kann die Geometrie flach sein, würde das nicht Probleme beim zeichnen geben (also beim Überdecken des zuvor gezeichneten Terrains)?


Naja zum einen würde ich zum Rendern des Fog of War Depth Buffering und Depth Test sowieso ausschalten und zum andren könntest du der Ebene auch einfach eine Höhe geben die konstant über der maximalen der Welt liegt (so wie ne Wolkendecke...)

David Mehre

unregistriert

15

06.08.2009, 13:04

Zitat von »"dot"«

Naja zum einen würde ich zum Rendern des Fog of War Depth Buffering und Depth Test sowieso ausschalten und zum andren könntest du der Ebene auch einfach eine Höhe geben die konstant über der maximalen der Welt liegt (so wie ne Wolkendecke...)


Dann würde das aber nur solange funktionieren, wie die Kamera senkrecht von oben auf das Terrain schaut...

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

16

06.08.2009, 13:06

Das ist natürlich richtig.

David Mehre

unregistriert

17

06.08.2009, 17:11

So, ich habe es jetzt geschafft :)

Nach dem Laden des Meshes erstelle kopiere ich die Vertices in eine eigene Vertexstruktur, die nur Position und Farbe (Startwert: 0,0,0,0) speichert. In jedem Frame überprüfe ich dann, ob sich ein Vektor im sichtbaren Bereich oder im Fog of War befindet oder nicht und setzte je nach dem die Alpha-Komponente der Vertexfarbe.

Beim Rendern zeichne ich zuerst das normale Mesh. Danach deaktiviere ich das Licht und aktiviere Alpha-Blending und zeichne das bearbeitete Mesh noch einmal darüber. Übergänge kommen da sogar (aufgrund der Interpolation) ganz von alleine :)

Wenn den Depth Buffer (Z-Buffer?) ausschalte, bekomme ich nur Probleme, dass das normale Mesh auch zum Teil opak wird...

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

18

06.08.2009, 17:20

Mach doch mal einen Screenshot, wie das aussieht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

06.08.2009, 17:38

Zitat von »"David Mehre"«

Übergänge kommen da sogar (aufgrund der Interpolation) ganz von alleine :)


So wars gedacht ;)

Zitat von »"David Mehre"«

Wenn den Depth Buffer (Z-Buffer?) ausschalte, bekomme ich nur Probleme, dass das normale Mesh auch zum Teil opak wird...


Das allerdings versteh ich nicht ganz, da wär ein Screenshot echt nicht schlecht...

David Mehre

unregistriert

20

06.08.2009, 18:08

Das Bild ist mit aktiviertem Z-Buffer gezeichnet (zuerst das normale Mesh, dann das bearbeitete):

(Link)


Bei diesem ist der Z-Buffer beim Zeichnen des bearbeiteten Meshes deaktiviert (D3DRS_ZENABLE = D3DZB_FALSE). An der rot markierten Stelle sieht man, dass das Ergebnis z.T. opak geworden ist.

(Link)


Vielleicht hat es ja auch etwas mit dem Alpha-Render-States zu tun. Zum zeichnen des bearbeiteten Meshes setze ich folgende RS:

C-/C++-Quelltext

1
2
3
4
D3D.SetRS (D3DRS_LIGHTING,          FALSE);
D3D.SetRS (D3DRS_ALPHABLENDENABLE,  TRUE);
D3D.SetRS (D3DRS_SRCBLEND,          D3DBLEND_SRCALPHA);
D3D.SetRS (D3DRS_DESTBLEND,        D3DBLEND_SRCALPHA);

Werbeanzeige