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

Nik94

Frischling

  • »Nik94« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Solingen

Beruf: Schüler

  • Private Nachricht senden

1

11.11.2012, 13:47

[DirectX9] Vertices werden nicht gerendert (Delphi6)

Hallo Zusammen,
Ich schreibe momentan im Rahemn einer Facharbeit eine kleine 3D-Engine in Delphi6 mit Direct3D9. Jetzt stellt sich aber dass Problem, dass ich keine Vertices teichnen lassen kann bgzw. diese nicht gezeichnet werden. Bei der Konfigurierung von D3D gtreten keine Probleme auf und ich benutze dieselben Einstellungen mit denen ich bei der TriBase-(oder ähnlichen)engines keine Probleme habe.

Hier erstmal der Quellcode:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Vertexformat
type TVertex = record
    vPosition:TVector3;
    dwColor:TD3DColor;
end;

{...}

procedure TForm1.FormCreate(Sender: TObject);
begin
   TA3DS.GetInstance().Init(true, self);

   // Vertizes anlegen
   m_aVertex[0].vPosition:=TVector3.Create(0.0, 1.0, 0.5);
   m_aVertex[1].vPosition:=TVector3.Create(1.0, -1.0, 0.5);
   m_aVertex[2].vPosition:=TVector3.Create(-1.0, -1.0, 0.5);
   m_aVertex[0].dwColor:=D3DCOLOR_ARGB(255, 255, 0, 0);
   m_aVertex[1].dwColor:=D3DCOLOR_ARGB(255, 0, 255, 0);
   m_aVertex[2].dwColor:=D3DCOLOR_ARGB(255, 0, 0, 255);

   Render(0);

   TA3DS.GetInstance().Exit();
end;

{...}

procedure TForm1.Render(rTime:Real);
var
   rAspect:Real;
   mProjection, mRotation, mTranslation, mWorld:TMatrix;
   pTempD3DDev:IDirect3DDevice9;
begin
   // Zeiger auf Direct3D-Gerät
   pTempD3DDev:=TDirect3D9.GetInstance().Direct3DDevice9;

   if pTempD3DDev=nil then
    g_pLogfile.Error('pTempD3DDEV = nil!');

   if failed(pTempD3DDev.Clear(0, nil,
                    D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,
                    D3DCOLOR_XRGB(0, 0, 63),
                    1.0, 0)) then
    g_pLogfile.Error('Clear() Failed');

   pTempD3DDev.BeginScene();
   pTempD3DDev.SetFVF(D3DFVF_XYZ or D3DFVF_DIFFUSE);
   pTempD3DDev.SetRenderState(D3DRS_LIGHTING, Integer(FALSE));
   pTempD3DDev.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
   pTempD3DDev.SetRenderState(D3DRS_DITHERENABLE, Integer(TRUE));
   pTempD3DDev.DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, m_aVertex, sizeof(TVertex));
   pTempD3DDev.EndScene();

   pTempD3DDev.Present(nil, 0, 0, 0);
end;

Des weiteren konnte ich den Fehler etwas eingrenzen:
1. Direct3D wird korrekt initialisiert (s.o.)
2. pTempD3DDev wurde erfolgreich erzeugt, da die Methiodenaufrufe Clear(..) und Present(..) Problemlos funktionieren, sprich nach dem Aufrufen der render-Funktion habe ich ein dunkelblaues Fenster vor mir, jedoch ohne den Vertices

Ich hoffe, dass mir hier jemand helfen kann.

Ps: Ja, ich habe auch Google bereits befragt ;)

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

2

11.11.2012, 21:50

Ich kenn mich mit Delphi nicht aus, aber was mir auffällt:
Wo werden denn deine Matrizen mProjection, mRotation, mTranslation, mWorld an den Shader bzw. den Zeichenaufruf übergeben?
Und wo wird festgelegt, welcher Shader verwendet werden soll, um die Vertices zu rendern?

Nik94

Frischling

  • »Nik94« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Solingen

Beruf: Schüler

  • Private Nachricht senden

3

11.11.2012, 21:57

Der Shader wird in Zeile 47 (pTempD3DDev.SetFVF(D3DFVF_XYZ or D3DFVF_DIFFUSE);) festgelegt. Die Metrizen habe ich vorerst rausgenommen, da es auch mit ihnen nicht funktioniert hat und ich so viele Fehlerquellen wie möglich erstmal ausschließen möchte. Außerdem werden in dem mit der Bibliothjek für Delphi mitgelieferten Beispielprogramm auch keine Matrizen gesetzt, also bin ich davon ausgegangen, dass es auch ohne diese Funktioniert.

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

4

11.11.2012, 22:01

Naja aber die Matrizen definieren ja, wie deine 3D-Koordinaten zusammen mit der Kameraperspektive in die Bildschirmkoordinaten umgerechnet werden. Ohne die kann da eigentlich gar nichts sinnvolles rauskommen. Eine Kameraposition finde ich übrigens in deinem Quellcode auch nicht wirklich, aber bin wie gesagt auch kein Spezi :)

Nik94

Frischling

  • »Nik94« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Solingen

Beruf: Schüler

  • Private Nachricht senden

5

12.11.2012, 15:29

Ich habe das ganze jetzt mal mit den Matrizen versucht, was jedoch auch keinen erfolg gebracht hat. Des weiteren bekomme ich immernoch keine Fehlermeldungen bzw. es werden alle Funktionen mit dem Rückgabewert 0 beendet.
Hier mal der Code zu den Matirzen (ab Zeile 39):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Bildseitenverhältnisse
   rAspect:=g_pDirect3DConfig.m_pVideoMode.Width/g_pDirect3DConfig.m_pVideoMode.Height;

   // Projektionsmatrix erstellen und setzen
   mProjection:=IMath.GetInstance().ProjectionMatrix(IMath.GetInstance().DegToRad(90.0),
                                                     rAspect,
                                                     0.1, 100.0);
   if Failed(pTempD3DDev.SetTransform(D3DTS_PROJECTION, mProjection.toD3DMATRIX)) then

      g_pLogfile.Error('SetTransform');
   // Rotations-und Translationsmatrix
   mRotation:=IMath.GetInstance().YRotationMatrix(IMath.GetInstance().DegToRad(10.0));
   mTranslation:=IMath.GetInstance().TranslationMatrix(TVector3.Create(0.0, 0.0, 2.0));
   mWorld:=IMath.GetInstance().MulMatrix(mRotation, mTranslation);
   if Failed(pTempD3DDev.SetTransform(D3DTS_WORLD, mWorld.toD3DMATRIX)) then
      g_pLogfile.Error('World');

LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

6

12.11.2012, 16:48

Und wo ist die View-Matrix?

Momentan hast du Matrizen, die die Position des Dreiecks beschreiben (World), sowie eine Projektionsmatrix, die den Kamerawinkel und die Sichtweite bestimmen. Aber es gibt noch keine Information darüber, wo die Kamera sich befindet und in welche Richtung sie guckt, also die View-Matrix.
Ich nehme mal an, dass dein Dreieck problemlos gezeichnet wird, deine Kamera aber mangels Viewmatrix einfach irgendwie schief in eine andere Richtung guckt und du deshalb nichts siehst.

Wenn ich mir die Syntax aus deinem Code mal so klaue, sollte es in etwa so aussehen:

Quellcode

1
mView:=IMath.GetInstance().LookAtLH(TVector3.Create(0.0, 0.0, 15.0), TVector3.Create(0.0, 0.0, 0.0), TVector3.Create(0.0, 1.0, 0.0));


Die Argumente dabei sind in angegebener Reihenfolge: Kameraposition, Kameraziel (Look at), ein Vektor, der "oben" definiert.
Und dann musst du deinem Shader/dem Renderaufruf natürlich auch noch verklickern, dass er die drei Matrizen verwenden soll.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LInsoDeTeh« (12.11.2012, 16:57)


LInsoDeTeh

Treue Seele

Beiträge: 372

Wohnort: Essen, Deutschland

Beruf: Team Lead Inhouse-Entwicklung

  • Private Nachricht senden

7

12.11.2012, 16:48

//EDIT: Irgendwie hats nen doppelten Post erzeugt. Warum kann ich meinen doppelten Post nicht löschen?

Nik94

Frischling

  • »Nik94« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Solingen

Beruf: Schüler

  • Private Nachricht senden

8

13.11.2012, 20:06

Also, Ich habe die Matrizen mal wieder eingefügt, jedoch funktioniert es immernochnicht.
Der Code sieht jetzt so aus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
procedure TForm1.Render(rTime:Real);
var
   rAspect:Real;
   mProjection, mRotation, mTranslation, mWorld, mCamera:TMatrix;
   pTempD3DDev:IDirect3DDevice9;
begin
   // Zeiger auf Direct3D-Gerät
   pTempD3DDev:=TDirect3D9.GetInstance().Direct3DDevice9;

   if pTempD3DDev=nil then
      g_pLogfile.Error('pTempD3DDEV = nil!');

   // Bildseitenverhältnisse
   rAspect:=g_pDirect3DConfig.m_pVideoMode.Width/g_pDirect3DConfig.m_pVideoMode.Height;

   // Projektionsmatrix erstellen und setzen
   mProjection:=IMath.GetInstance().ProjectionMatrix(IMath.GetInstance().DegToRad(90.0),
                                                     rAspect,
                                                     0.1, 100.0);
   if Failed(pTempD3DDev.SetTransform(D3DTS_PROJECTION, mProjection.toD3DMATRIX)) then

      g_pLogfile.Error('SetTransform');
   // Rotations-und Translationsmatrix
   mRotation:=IMath.GetInstance().YRotationMatrix(IMath.GetInstance().DegToRad(10.0));
   mTranslation:=IMath.GetInstance().TranslationMatrix(TVector3.Create(0.0, 0.0, 2.0));
   mWorld:=IMath.GetInstance().MulMatrix(mRotation, mTranslation);
   if Failed(pTempD3DDev.SetTransform(D3DTS_WORLD, mWorld.toD3DMATRIX)) then
      g_pLogfile.Error('World');
   // Kameramatrix
   mCamera:=IMath.GetInstance().CameraMatrix(TVector3.Create(0.0, 0.0, 15.0),
                                             TVector3.Create(0.0, 0.0, 0.0),
                                             TVector3.Create(0.0, 1.0, 0.0));
   pTempD3DDev.SetTransform(D3DTS_VIEW, mCamera.toD3DMATRIX);


   if failed(pTempD3DDev.Clear(0, nil,
                     D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,
                     D3DCOLOR_XRGB(0, 0, 63),
                     1.0, 0)) then
      g_pLogfile.Error('Clear() Failed');

   if Failed(pTempD3DDev.BeginScene()) then
      g_pLogfile.Error('BeginScene');
   if Failed(pTempD3DDev.SetFVF(D3DFVF_XYZ or D3DFVF_DIFFUSE)) then
      g_pLogfile.Error('SetFVF');
   pTempD3DDev.SetRenderState(D3DRS_LIGHTING, Integer(FALSE));
   pTempD3DDev.SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
   pTempD3DDev.SetRenderState(D3DRS_DITHERENABLE, Integer(TRUE));
   if Failed(pTempD3DDev.DrawPrimitiveUP(D3DPT_TRIANGLELIST, 1, m_aVertex, sizeof(TVector3)+sizeof(TD3DColor))) then
      g_pLogfile.Error('DrawPrimitiveUP');
   if Failed(pTempD3DDev.EndScene()) then
      g_pLogfile.Error('EndScene');

   if Failed(pTempD3DDev.Present(nil, 0, 0, 0)) then
      g_pLogfile.Error('Present')
   else
      g_pLogfile.Warning('RENDERED');
end;

Nik94

Frischling

  • »Nik94« ist der Autor dieses Themas

Beiträge: 18

Wohnort: Solingen

Beruf: Schüler

  • Private Nachricht senden

9

16.11.2012, 15:50

Ich habe das Problem gefunden: Ich habe eine Vector3und Matrix-Klasse angelegt, allerdings schein sich in Pascal die Klassensignatur von der einer Struktur (record) zu unterscheiden, sodass ich meine Vektor und Matirxklassen auflösen und in Form von Strukturen verarbeiten muss.
An dieser Stalle aber auch nochmal ein herzliches Dankeschön an die, die mir geholfen haben.

Werbeanzeige