AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi DirectX - Vertex beleuchten / umfärben
Thema durchsuchen
Ansicht
Themen-Optionen

DirectX - Vertex beleuchten / umfärben

Ein Thema von XoRiC · begonnen am 13. Okt 2009 · letzter Beitrag vom 15. Okt 2009
Antwort Antwort
XoRiC

Registriert seit: 20. Sep 2005
43 Beiträge
 
RAD-Studio 2009 Arc
 
#1

DirectX - Vertex beleuchten / umfärben

  Alt 13. Okt 2009, 15:45
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:

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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#2

Re: DirectX - Vertex beleuchten / umfärben

  Alt 13. Okt 2009, 16:01
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.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
XoRiC

Registriert seit: 20. Sep 2005
43 Beiträge
 
RAD-Studio 2009 Arc
 
#3

Re: DirectX - Vertex beleuchten / umfärben

  Alt 14. Okt 2009, 00:27
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
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#4

Re: DirectX - Vertex beleuchten / umfärben

  Alt 14. Okt 2009, 18:02
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
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
XoRiC

Registriert seit: 20. Sep 2005
43 Beiträge
 
RAD-Studio 2009 Arc
 
#5

Re: DirectX - Vertex beleuchten / umfärben

  Alt 15. Okt 2009, 14:21
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.

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:

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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