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

1

29.07.2008, 03:59

Darstellungsproblem bei Triangle Lists

hallo, ich habe irgendwo einen Fehler bei der Darstellung meines primitive. Es ist ein schwarzer Bildschirm ohne der Zeichnung.

ich hatte eigentlich versucht an alles zu denken, aber es erscheint nichts -.-

- es sollten die 3 Koordinaten mit einander verbunden werden (Triangle List) die dabei entstehende Fläche sollte gefärbt werden.

Meine Renderfunktion sieht so aus:

Ich bin mir nicht sicher ob die "geometry pipeline" ordnungsgemäß funktioniert bzw. ich einfach über das Dreieck sehe.

C-/C++-Quelltext

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
tbResult RenderProc(float fNumSecsPassed)
{
    SVertex     aVertex[3];
    tbMatrix    mCamera;
    tbMatrix    mProjection;
    tbVector3   vCameraPos;
    tbVector3   vCameraLookAt;
    
    // Puffer leeren und die Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();

    D3D.SetRS(D3DRS_ZENABLE, TRUE);
    D3D.SetRS(D3DRS_LIGHTING, FALSE);
    

    D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0);
    D3D->BeginScene();

    // Vertexformat setzen

    D3D.SetFVF(SVertex::dwFVF);


    vCameraPos      = tbVector3(0.0f, 8.0f, 25.0f);
    vCameraLookAt           = tbVector3(0.0f, 0.0f, 0.0f);

    // Kameramatrix erstellen und aktivieren

    mCamera = tbMatrixCamera(vCameraPos, vCameraLookAt);
    D3D.SetTransform(D3DTS_VIEW, mCamera);

        // Projektionsmatrix erstellen und aktivieren

    mProjection = tbMatrixProjection(TB_DEG_TO_RAD(70.0f),
                                     D3D.GetAspect(),
                                     0.1f, 100.0f);
    D3D.SetTransform(D3DTS_PROJECTION, mProjection);
    D3D.SetTransform(D3DTS_WORLD, seMatrixIdentity());

    aVertex[0].vPosition = tbVector3(-3.0f, 0.0f, 3.0f);
    aVertex[0].Color = tbColor(1.0f, 0.8f, 0.8f);

    aVertex[1].vPosition = seVector3(-3.0f, 0.0f, -3.0f);
    aVertex[1].Color = tbColor(0.8f, 1.0f, 0.8f);

    aVertex[2].vPosition = seVector3(3.0f, 0.0f, 3.0f);
    aVertex[2].Color = tbColor(0.8f, 0.8f, 1.0f);

    D3D->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 0, aVertex, sizeof(SVertex));


    // Szene beenden

    D3D->EndScene();
    D3D->Present(NULL, NULL, NULL, NULL);
    return TB_OK;
}

2

29.07.2008, 08:11

Liegt möglicherweise an der Kameraposition:

C-/C++-Quelltext

1
vCameraPos = tbVector3(0.0f, 8.0f, 25.0f); 

So steht die Kamere auf der Z-Achse vor deinem Dreieck, welches sich bei 3.0f befinden sollte.

3

29.07.2008, 13:00

ich hab schon versucht den Vector der Camera neu definiert mit

0.0f, 0.2f, 0.2f

aber da tut sich nichts.

*grübel*

4

29.07.2008, 13:54

So, aus verzweiflung habe ich erstmal das Dreick auf das nötigste beschränkt. Ist der sourceCode ok? ich hab bestimmt was vergessen -.-

C-/C++-Quelltext

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
struct SVertex
{
    tbVector3           vPosition;
    D3DCOLOR        Color;
    static const DWORD  dwFVF;
};

const DWORD SVertex::dwFVF = D3DFVF_XYZRHW | D3DFVF_DIFFUSE;


// ******************************************************************

// Globale Variablen

tbConfig            g_Config;           // Konfigurationsstruktur


// ******************************************************************

// Die Move-Funktion

tbResult MoveProc(float fNumSecsPassed)
{
    
    return TB_OK;
}

// ******************************************************************

// Die Render-Funktion

tbResult RenderProc(float fNumSecsPassed)
{
    SVertex        aVertex[3];
   
    // Puffer leeren und die Szene beginnen

    tbDirect3D& D3D = tbDirect3D::Instance();
  
    // Vertexformat setzen

    D3D.SetFVF(SVertex::dwFVF);
 
    D3D->BeginScene();

    aVertex[0].vPosition = tbVector3(320.0f, 50.0f, 0.5f);
    aVertex[0].Color = tbColor(1.0f, 0.8f, 0.8f);

    aVertex[1].vPosition = tbVector3(520.0f, 400.0f, 0.5f);
    aVertex[1].Color = tbColor(1.0f, 0.8f, 0.8f);

    aVertex[2].vPosition = tbVector3(120.0f, 400.0f, 0.5f);
    aVertex[2].Color = tbColor(1.0f, 0.8f, 0.8f);

    D3D->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 0, aVertex, sizeof(SVertex));

    // Szene beenden

    D3D->EndScene();
    D3D->Present(NULL, NULL, NULL, NULL);
    return TB_OK;
}

// ******************************************************************

// Aufräumen

tbResult CleanUp()
{
    // Alles löschen

    // Direct3D herunterfahren

    tbDirect3D::Instance().Exit();

    // Die TriBase-Engine herunterfahren

    tbExit();

    return TB_OK;
}

// ******************************************************************

// Windows-Hauptfunktion

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCommandLine,
                   int iShowCommand)
{
    // TriBase-Engine initialisieren

    tbInit();

    // Konfiguration abfragen

    tbResult r;
    if(r = seDoConfigDialog(&g_Config))
    {
        if(r == TB_CANCELED) return 0;
        else
        {
            // Fehler!

            MessageBox(NULL, "Fehler im Konfigurationsdialog!", "Fehler",
                       MB_OK | MB_ICONEXCLAMATION);
            return 1;
        }
    }

    // Direct3D initialisieren

    if(tbDirect3D::Instance().Init(&g_Config,
                                   "Beispielprogramm",
                                   NULL,
                                   LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        // Fehler!

        MessageBox(NULL, "Fehler bei der Direct3D-Initialisierung!", "Fehler",
                   MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Nachrichtenschleife betreten

    if(tbDoMessageLoop(MoveProc, RenderProc))
    {
        MessageBox(tbDirect3D::Instance().GetWindow(), "Fehler beim Zeichnen!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        CleanUp();
        return 1;
    }

    // Aufräumen

    CleanUp();

    return 0;
}

// ******************************************************************


Mittlerweile mag ich die schwarz nicht mehr ^^

5

29.07.2008, 14:10

C-/C++-Quelltext

1
D3D->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 0, aVertex, sizeof(SVertex)); 

Parameter 2 müsste doch 1 statt 0 sein? (für ein Dreieck)

Zitat von »"DirectX Doku"«

PrimitiveCount
[in] Number of primitives to render


Und was ist mit dem hier:

C-/C++-Quelltext

1
D3D->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER , tbColor(0.0f, 0.0f, 0.0f), 1.0f, 0); 

Vergessen?

6

29.07.2008, 14:48

Zitat

C-/C++-Quelltext

1
D3D->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 0, aVertex, sizeof(SVertex)); 


Parameter 2 müsste doch 1 statt 0 sein? (für ein Dreieck)


Jap, müsste mindestens 1 sein. Das sind ja die Anzahl der Dreiecke

-> für ein ganzes Viereck bräuchtest also 2, wenn du 0 angibst, dann ist klar, dass du nichts siehst.

7

29.07.2008, 15:28

erstmal danke für die Schusselfehler, aber der Bildschrim bleibt immernoch schwarz. Wie kann ich denn da bei der fehleranalyse vorgehen, immerhin soviel code ist es nun auch wieder nicht.

merkwürdig

8

29.07.2008, 15:40

Verwende mal folgendes Vertexformat:

C-/C++-Quelltext

1
const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE;


Vorder- und Rückseite rendern:

C-/C++-Quelltext

1
D3D->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);  


Und dein Vertexbuffer:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
aVertex[0].vPosition = D3DXVECTOR3(-1.0f, 0.0f, 1.0f);
aVertex[0].Color = tbColor(1.0f, 0.0f, 0.0f);

aVertex[1].vPosition = D3DXVECTOR3(0.0f, 1.0f, 1.0f);
aVertex[1].Color = tbColor(0.0f, 1.0f, 0.0f);

aVertex[2].vPosition = D3DXVECTOR3(1.0f, 0.0f, 1.0f);
aVertex[2].Color = tbColor(0.0f, 0.0f, 1.0f);


So habe ich das grad mal getestet (und für gut befunden) ;)

9

29.07.2008, 16:33

oh scheint am Vertexformat gelegen zu haben, danke sehr 8)

Kommt man auf sowas nur durch probieren oder Erfahrung ^^?

10

29.07.2008, 16:45

Zitat von »"Keydo"«

Komt man auf sowas nur durch probieren oder Erfahrung ^^?

Beides. :)
Irgendwann kennst du die Knackpunkte.
(siehe auch: Gern gemachte Fehler, Band 1-10)

Werbeanzeige