Autor Beitrag
GuaAck
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 308
Erhaltene Danke: 29

Windows 8.1
Delphi 7 Pers.
BeitragVerfasst: Sa 15.06.19 23:06 
Hallo,

vielleicht gibt es ja einen Experten, der mir hier helfen kann:

Ich habe Erfahrung mit DirectX, aber nur zur z. B. animierten Darstellung von statistischen Daten; da habe ich nie Texturen gebraucht.

Jetzt habe ich ein Spiel programmiert, bei dem Holz-Spielsteine angeordnet und gestapelt sind. (Ähnlich wie Kyodai, wer das kennt.)

Jetzt zu meinem konkreten Problem: Ein Spielstein hat ein Bild auf der Oberseite. Wenn z. B. rechts von dem Spielstein ein höherer Stapel von Steinen liegt, dann soll ein entsprechemder Schatten auf dem Bild dargestellt werden.

Meine aktuelle Lösung: Ich erzeuge mit einem anderen Programm die Bilder für alle (z. Z. 12) vorkommenden Schattierungen als eigene Bitmaps, die ich dann als Resource in mein Programm einbinde. Im Programm ermittele ich den Verschattungszustand und setze dann die entsprechende Textur. Funktioniert nicht schlecht.

Nachteil 1: Es gibt Schattensituationen, die in meinen 12 Versionen nicht enthalten sind; in der nächsten Version werden es mehr sein.

Nachteil 2: Ich möchta das Thema der Bilder auf den Steinen (Blumen, Häuser, Autos,...) zur Laufzeit ändern. Ich müsste mit meinem Verfahren für jedes neue Thema die Bilder mit allen vorhommenden Schattierungen erzeugen.

Das ist alles machbar,aber vielleicht geht es ja mit Blending besser. Texture0=Bild, Texture1=Schatten. In meinen Gehversuchen "blended" es, aber nie so, wie ich es beschrieben habe. Ich möchte ja nur die beiden Testuren mischen , z.B. per D3DTOP_MODULATE.

Kennt jemand ein gutes Buch zu diesem Bereich, evt. auch ein Tutorial oder hat ein parr Zeilen Code griffbereit, die mir helfen könnten?

Viele Grüße
GuaAck
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# (VS 2017)
BeitragVerfasst: Di 18.06.19 13:24 
Welche Direkt X Version bzw. welches SDK verwendest du?
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 308
Erhaltene Danke: 29

Windows 8.1
Delphi 7 Pers.
BeitragVerfasst: Di 18.06.19 23:43 
Hallo Chiyoko,

DirectX8.

Ich nutze die Headers von Microsoft, die jemand mit viel Arbeit von C/C++ in Pascal übersetzt hat. Geht bestens, die Beschreibung von Microsoft passt zuverlässig.

Da ich nur die elemtaren Funktionen von DirectX nutze, lohnt ein Übergang auf eine höhere Version nicht, zumal ich dafür erst ein Pascal-Interface finden müsste.

Danke für Dein Interesse und Deine Hilfsbereitschaft,
Gruß GuaAck
Chiyoko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 298
Erhaltene Danke: 8

Win 98, Win Xp, Win 10
C# (VS 2017)
BeitragVerfasst: Mi 19.06.19 07:41 
DirectX 8 Shadowmapping sample
DirectX 9 Shadowmapping sample

Was sich eventuell in deinem Fall am besten eigenen würde, wäre Projection Mapping.
DirectX 9 Projection Mapping

Du kannst ja erstmal schauen, ob dir das weiter hilft. Vor allem letzte 2 Links sind ziemlich umfangreich, allerdings in C++ und DirectX 9.
Zu DirectX 8 findet sich nicht sehr viel.

Bücher:
DirectX 9 und C++ Buch
DirectX 9 Einstieg

Dazu kann ich aber keine Empfehlungen aussprechen. Das erste Buch hatte ich kurzzeitig in der Hand, habs dann aber verkauft, weil C++ nicht mein Steckenpferd war :D


EDIT: Wie ich sehe, nutzt du FFP Effekte. Eventuell steigst du lieber auf HLSL Shader um. Die sind flexibler und du findest mehr Tutorien dazu.


Zuletzt bearbeitet von Chiyoko am Do 20.06.19 07:07, insgesamt 1-mal bearbeitet

Für diesen Beitrag haben gedankt: GuaAck
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 308
Erhaltene Danke: 29

Windows 8.1
Delphi 7 Pers.
BeitragVerfasst: Mi 19.06.19 17:21 
Hallo Chiyoko,

vielen Dank für die Hinweise. Die Microsoft-Beipeile sehen hilfreich aus, wenngleich auch relativ umfangreich, aber die probiere ich mals aus. Das Spieleprogrammierbuch habe ich bestellt.

Viele Grüße
GuaAck
GuaAck Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 308
Erhaltene Danke: 29

Windows 8.1
Delphi 7 Pers.
BeitragVerfasst: Mo 24.06.19 22:16 
Hallo,

falls jemand im Forum nach einer Lösung sucht, hier die Lösung: In der Microsoft-Dokumentation zu DirectX8 (die ich ausgezeichnet finde!) ist das Blending übersichtlich beschrieben. Es fehlt eine Kleinigkeit: Für jede Stage muss die Koordinatentransformation mit dem Parameter D3DTSS_TEXCOORDINDEX gesetzt sein. An anderer Stelle in der Dokumentation ist das bestens beschrieben, man muss eben wissen nach was man sucht.

Genau das wusste ich nicht.

Unten mein Code,
Gruß
GuaAck



ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
      texture := TexSchatten;
      d3ddevice.SetTexture(0, TextBild); // Texture für Stage 0
      IF texture <> NIL THEN
        BEGIN
          d3ddevice.SetTexture(1, texture); // Texture für Stage 1

          // Stage 0 ist das Anbringen der Texture
          d3ddevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
          d3ddevice.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
          // Stage 1: Nächste Textur zumischen
          d3ddevice.SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 0);
          d3ddevice.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_Modulate);
          d3ddevice.SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_CURRENT);
          d3ddevice.SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_TEXTURE);
          // Stage 2 Abschalten
          d3ddevice.SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_DISABLE);
        END
      ELSE
        d3ddevice.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
      d3ddevice.DrawIndexedprimitive(Primitive, StartVertexD, AnzVerticesD,
        StartIndexD, PrimitiveCountD);