Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectX - Vertex beleuchten / umfärben (https://www.delphipraxis.net/141662-directx-vertex-beleuchten-umfaerben.html)

XoRiC 13. Okt 2009 15:45


DirectX - Vertex beleuchten / umfärben
 
Hallo,

ich bin noch immer dabei, mich in DirectX 8 mit Delphi 6 einzuarbeiten.
Bisher hab ich meine Texturen ausschließlich mit Sprites gezeichnet.
Das war relativ einfach und funktioniert inzwischen wunderbar.

Nun hab ich den Schritt zu Vertexen gewagt und komme an einer Stelle nicht weiter.
Es geht darum, diese beim Zeichnen umzufärben. Bei den Sprites habe ich das so realisiert:

Delphi-Quellcode:
Sprite.Draw(Texture, @Source, @Scale, @RotCenter, 0, @Dest, Color);
Als Color übergebe ich beispielsweise eine rote Farbe: Color := D3DCOLOR_RGBA(255, 25, 25, 255);
Das Ergebnis sieht man hier:

http://img382.imageshack.us/img382/4100/roty.jpg


Das gleiche möchte ich jetzt bei meinen Vertexen erreichen.
Dass es hier etwas aufwändiger wird als bei den Sprites hab ich schnell gemerkt.
Beim Zeichnen kann meines Wissens nicht mehr so einfach eine Farbe als Parameter an DirectX übergeben werden.

Ich verwende folgende Vertexe:

Delphi-Quellcode:
type
  TMyVertex = record
    X, Y, Z, rhw: Single;
    U, V: Single;
  end;

  TQuadVertex = array [0..3] of TMyVertex;
Gezeichnet habe ich sie bisher so:

Delphi-Quellcode:
  with Device do
  CreateVertexBuffer (SizeOf(TQuadVertex),
                      D3DUSAGE_WRITEONLY,
                      D3DFVF_XYZRHW or D3DFVF_TEX1,
                      D3DPOOL_MANAGED,
                      Quad);

with Quad do
begin
  Lock(0, 0, Vertices, 0);
  Move(DX.Vertex, Vertices^, SizeOf(TQuadVertex));
  Unlock;
end;

with Device do
begin
  SetVertexShader(D3DFVF_XYZRHW or D3DFVF_TEX1);
  SetStreamSource(0, Quad, SizeOf(TMyVertex));
  SetTexture(0, Texture);
  DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
end;
Auch das funktioniert einwandfrei, mein derzeit verwendeter Code bietet mir jedoch keine Möglichkeit, die Textur der Vertexe beim Zeichnen zu verfärben.

Bei meinen Recherchen bin ich u.a. auf die Methode SetMaterial gestoßen und habe ein paar Versuche damit unternommen.
Ich hab ein Material erstellt und ihm einen roten Diffuse, Specular und Ambient Wert zugewiesen.
Das Material hab ich meinem Device zugewiesen und etwas hilflos einige Einstellungen mit SetRenderState durchprobiert.

Leider hat sich an meinen Vertexen nie eine Änderung gezeigt.
Ob das Material meinem Device zugewiesen war oder nicht, hatte überhaupt keine Auswirkung.
Bringt die Zuweisung eines Materials überhaupt etwas, wenn man kein Licht verwendet?
Wie kann ich die Textur meiner Vertexe beim Zeichnen umfärben?

Da ich trotz meiner Bemühungen auf keinen grünen Zweig komme, wollte ich es mal im Forum probieren.
Hat jemand vielleicht ein paar Tipps / Links für mich?
Würde mich sehr darüber freuen!

Gruß an alle
Xoric

igel457 13. Okt 2009 16:01

Re: DirectX - Vertex beleuchten / umfärben
 
Verwende ein Material, aktiviere die Lichtberechnung, setze die Ambientfarbe auf Weiß. Je nachdem welche Ambientfarbe du nun im Material definierst, werden deine Objekte in dieser Farbe dargestellt.

XoRiC 14. Okt 2009 00:27

Re: DirectX - Vertex beleuchten / umfärben
 
Hi igel,

vielen Dank für deine Antwort! Ich habe meinen Code nun nach deinen Anweisungen umgebaut, bzw hatte es so oder so ähnlich sogar schon ausprobiert. Leider tut sich noch immer nichts.

Delphi-Quellcode:
with Device do begin

  SetVertexShader( D3DFVF_XYZRHW or D3DFVF_TEX1 );
  SetStreamSource( 0, Quad, SizeOf(TMyVertex) );

  // Licht an
  SetRenderState( D3DRS_LIGHTING, DWord(true));      
     
  // Ambient = weiß     
  SetRenderState( D3DRS_AMBIENT, D3DCOLOR_XRGB(255,255,255) );    

  // Material Ambient = rot
  Material.Ambient.r := 1.0;
  Material.Ambient.g := 0;
  Material.Ambient.b := 0;
  Material.Ambient.a := 1.0;

  SetMaterial(Material);
  SetTexture(0, Texture);

  DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

end;
Die Textur wird völlig ohne Abänderungen in den Farbwerten gezeichnet, so als würde ich kein Material verwenden.
Das Material hat also überhaupt keine Auswirkung auf das Bild das am Ende erscheint.

Fehlt noch irgendwo etwas oder hab ich was falsch gemacht?
Bin nach wie vor sehr dankbar über jeden Tipp.

Gruß Xoric

igel457 14. Okt 2009 18:02

Re: DirectX - Vertex beleuchten / umfärben
 
Du musst das Material noch als Quelle für die Farben einstellen:
Delphi-Quellcode:
//Use the material as material source
FParent.Direct3DDevice9.SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
FParent.Direct3DDevice9.SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
FParent.Direct3DDevice9.SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);
FParent.Direct3DDevice9.SetRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
Vielleicht hilft dir auch das hier etwas weiter:
http://andorra.cvs.sourceforge.net/v...w=markup#l_733

XoRiC 15. Okt 2009 14:21

Re: DirectX - Vertex beleuchten / umfärben
 
Habe das Problem nun in den Griff bekommen.
Wie immer hier die Lösung, falls es noch andere interessiert.

Meine alten Vertexe habe ich durch Vertexe vom Typ D3DTLVERTEX ersetzt.
Diesen Typ gibt es meines Wissens seit DirectX 8 nicht mehr, man kann ihn aber leicht selbst bauen:

Delphi-Quellcode:
type
  D3DTLVERTEX = record
    x, y, z, rhw: Single;
    Color, Specular: D3DCOLOR;
    U, V: Single;
  end;
Die Specular Farbe wird nicht verwendet, sollte aber trotzdem initialisiert werden.
Entscheidend ist nun die Farbe, die Color zugewiesen wird, hier im Beispiel ist es rot.

Delphi-Quellcode:
// Specular mit weiß initialisieren
Vertex.Specular := D3DCOLOR_XRGB(255, 255, 255);

// Color = rot setzen
Vertex.Color := D3DCOLOR_XRGB(255, 0, 0);
Beim Zeichnen muss jetzt der Vertex Shader vom Device an folgende Einstellung angepasst werden.

Delphi-Quellcode:
Device.SetVertexShader(D3DFVF_XYZRHW or D3DFVF_DIFFUSE or D3DFVF_SPECULAR or D3DFVF_TEX1);
Textur und Stream Source noch setzen und das ganze noch zeichnen lassen:

Delphi-Quellcode:
DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
Funktioniert bei mir nun einwandfrei und ohne Beeinträchtigung der fps.

Danke für deine Hilfe igel!
Gruß an alle,
Xoric


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz