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

17.04.2008, 13:37

Beispielprogramm 2.6.8 aus dem Buch - Problem

Hallo zusammen

Ich habe ein kleines Problem bei dem Beispielprogramm vom Buch Kapitel 2.68.

Es handelt sich hierbei um das Beispielprogamm mit den verschiedenen Filterkombinationen.

Ich habe versucht den Code so umzuschreiben das man die Tribase "Engine" nicht verwenden muss und nun zeigt es keine Dreiecke mehr an.

Der Fehler liegt mit 99.9% sicherheit bei der Render Funktion.

Der Code:

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
void render(float fNumSecsPassed)
{
    HRESULT     hResult;
    D3DXMATRIX  mScaling;       // Skalierungsmatrix

    D3DXMATRIX  mRotationX;     // Rotationsmatrix für die x-Achse

    D3DXMATRIX  mRotationY;     // Rotationsmatrix für die y-Achse

    D3DXMATRIX  mRotationZ;     // Rotationsmatrix für die z-Achse

    D3DXMATRIX  mTranslation;   // Translationsmatrix

    D3DXMATRIX  mWorld;         // Vereinende Weltmatrix



    // Den Bildpuffer und den Z-Buffer leeren

    if(FAILED(hResult = g_pD3DDevice->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                            D3DCOLOR_XRGB(0, 63, 0),
                                            1.0f,
                                            0)))
    {
        // Fehler beim Leeren!

    }

    // Szene beginnen

    g_pD3DDevice->BeginScene();


    // Keine Filter ("PlayStation-Effekt"), auch kein MIP-Mapping

    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT);
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE);
    

    // Jedes einzelne Dreieck zeichnen

    for(int iTriangle = 0; iTriangle < g_iNumTriangles; iTriangle++)
    {
        // Skalierungsmatrix anhand der Größe des Dreiecks erstellen

        D3DXMatrixScaling(&mScaling, g_aTriangle[iTriangle].fSize, g_aTriangle[iTriangle].fSize, g_aTriangle[iTriangle].fSize);

        

        // Rotationsmatrizen für das Dreieck erzeugen

        D3DXMatrixRotationX(&mRotationX, g_aTriangle[iTriangle].vRotation.x);
        D3DXMatrixRotationY(&mRotationY, g_aTriangle[iTriangle].vRotation.y);
        D3DXMatrixRotationZ(&mRotationZ, g_aTriangle[iTriangle].vRotation.z);

        // Translationsmatrix

        D3DXMatrixTranslation(&mTranslation, g_aTriangle[iTriangle].vPosition.x, g_aTriangle[iTriangle].vPosition.y, g_aTriangle[iTriangle].vPosition.z);
        
        // Alle Matrizen kombinieren und als Weltmatrix einsetzen

        mWorld = mScaling * mRotationX * mRotationY * mRotationZ * mTranslation;
        g_pD3DDevice->SetTransform(D3DTS_WORLD, &mWorld);

        if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,               // Dreiecksliste

                                                          1,                                // 1 Dreieck

                                                          g_aTriangle[iTriangle].aVertex,   // Vertexdaten

                                                          sizeof(SVertex))))                // Vertexgröße

        {
            // Fehler beim Zeichnen!

            MessageBox(g_hWnd, TEXT("Fehler beim zeichnen!"), TEXT("Render fehler"), MB_OK | MB_ICONWARNING | MB_SETFOREGROUND);
        }
    }

    // Szene beenden

    g_pD3DDevice->EndScene();

    // Bildpuffer sichtbar machen

    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}



Nochwas, ich habe 3 Funktion von der Tribase Engine mit drin gelassen, weil diese meiner Meinung nach ziemlich nützlich sind.
Das wären: tbVector3Random, tbVector3NormalizeEx und tbFloatRandom

Ich bitte um eure Hilfe. Danke schon mal im voraus. Greetz Phil
Miau

2

17.04.2008, 13:47

Hallo anoner bzw. Phil,

poste doch mal die Füll-Funktion für den Vertexbuffer.
Welches Vertexformat verwendest du? Und klappt das ohne das Rotations- und Translationszeug? Licht aus? Cullmode?

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

3

17.04.2008, 13:54

Ich sehe hier kein Vertexbuffer. ;)

Aber interessant wäre es das füllen von g_aTriangle zu sehen. ;)

Ich würde jetzt einfach mal alles so weit, wie möglich vereinfachen. Keine Rotation usw. und dann siehst du es auch eher, wo das Problem liegt.

4

17.04.2008, 14:00

Ich hab gerade mal die Koordinaten der Dreiecke ausgegeben und die werden schön random gewechslet.

Vertexformat ist:

D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;

Im Beispielprogramm vom Buch ist auch Licht aus.

C-/C++-Quelltext

1
2
3
    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);


Füllfunktion:

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
for(int iTriangle = 0; iTriangle < g_iNumTriangles; iTriangle++)
    {
        // Alle Dreiecke starten am Punkt (0, 0, 50).

        g_aTriangle[iTriangle].vPosition = D3DXVECTOR3(0.0f, 0.0f, 50.0f);

        // Die Bewegung ist zufällig.

        g_aTriangle[iTriangle].vVelocity = tbVector3Random() * tbFloatRandom(0.1f, 5.0f);
        
        // Rotation zurücksetzen

        g_aTriangle[iTriangle].vRotation = D3DXVECTOR3(0.0f, 0.0f, 0.0f);

        // Rotationsgeschwindigkeit ist zufällig auf allen drei Achsen

        g_aTriangle[iTriangle].vRotVelocity.x = tbFloatRandom(-1.0f, 1.0f);
        g_aTriangle[iTriangle].vRotVelocity.y = tbFloatRandom(-1.0f, 1.0f);
        g_aTriangle[iTriangle].vRotVelocity.z = tbFloatRandom(-1.0f, 1.0f);

        // Größe zufällig zwischen 1 und 5 festlegen

        g_aTriangle[iTriangle].fSize = tbFloatRandom(1.0f, 5.0f);

        // Nun die einzelnen Vertizes generieren.

        for(int iVertex = 0; iVertex < 3; iVertex++)
        {
            // Position

            g_aTriangle[iTriangle].aVertex[iVertex].vPosition = tbVector3Random();

            // Farbe

            VertexColor.r = tbFloatRandom(0.0f, 1.0f);
            VertexColor.g = tbFloatRandom(0.0f, 1.0f);
            VertexColor.b = tbFloatRandom(0.0f, 1.0f);
            g_aTriangle[iTriangle].aVertex[iVertex].dwColor = VertexColor;

            // Texturkoordinaten zufällig zwischen -1 und 2 erzeugen

            g_aTriangle[iTriangle].aVertex[iVertex].vTexture.x = tbFloatRandom(-1.0f, 2.0f);
            g_aTriangle[iTriangle].aVertex[iVertex].vTexture.y = tbFloatRandom(-1.0f, 2.0f);
        }
    }
Miau

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

17.04.2008, 14:04

Hmm. Dann mach das Beispiel wieder Stück für Stück zurück in die Ursprüngliche Form. Irgendwann siehst du was und dann kannst du schauen, was du anders gemacht hast.

6

17.04.2008, 14:09

Mmmh ich verwende keine TriBase Engine :)

Es liegt am zeichnen, weil die koordinaten der dreiecke bewegen sich.

Es könnte auch gut möglich sein das die Kameraposition nicht stimmt aber das test ich gerade.


Update: Ich habe den Fehler gefunden.

Ich habe die D3DXMatrixLookAtLH() MatrixView falsch gesetzt:

C-/C++-Quelltext

1
2
3
   D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3(0.0f, 0.0f, 10.0f), 
                                  &D3DXVECTOR3(0.0f, 0.0f, 0.0f), 
                                  &D3DXVECTOR3(0.0f, 1.0f, 0.0f ) );


und jetzt ist sie auf:


C-/C++-Quelltext

1
2
3
 D3DXMatrixLookAtLH( &matView, &D3DXVECTOR3(0.0f, 0.0f, 60.0f), 
                                  &D3DXVECTOR3(0.0f, 0.0f, 0.0f), 
                                  &D3DXVECTOR3(0.0f, 1.0f, 0.0f ) );


Die tiefen Angabe war nicht richtig, zuerst auf 10.0f und jetzt 60.0f.

Danke für eure Hilfe!
Miau

Werbeanzeige