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

24.01.2004, 11:29

Kein Dreieck im Vollbild

Hallo!

Ich hab folgendes Problem:
Wenn ich das Beispiel mit dem rotierenden Dreieck aus David's Buch in meine App einbaue, dann zeigt er nur im Fenstermodus dieses rotierende Dreieck. Im Vollbildmodus sehe ich nur machmal vereinzelt ein paar Pixel.
(Nie das komplette Dreieck)

Ich vermute mal es liegt an der InitD3D Funktion, da wenn ich das Sampel aus der DX Doku bei mir einbaue, tritt das gleiche Phänomen auf.

Hier nun der Code:

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
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
bool InitD3D()
{
     // Create the D3D object, which is needed to create the D3DDevice.
    if( NULL == ( g_pD3D = Direct3DCreate9( D3D_SDK_VERSION ) ) )
        return false;

    D3DPRESENT_PARAMETERS d3dpp; 
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
    if(!fullscreen)
    {
        d3dpp.Windowed = true;
        d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
        d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
    }
    else
    {
    
    ZeroMemory(&d3dpp, sizeof(D3DPRESENT_PARAMETERS));
    d3dpp.BackBufferWidth               = 640;
    d3dpp.BackBufferHeight              = 480;
    d3dpp.BackBufferFormat              = D3DFMT_X8R8G8B8;
    d3dpp.BackBufferCount               = 1;
    d3dpp.MultiSampleType               = D3DMULTISAMPLE_NONE;
    d3dpp.MultiSampleQuality            = 0;
    d3dpp.SwapEffect                    = D3DSWAPEFFECT_DISCARD;
    d3dpp.hDeviceWindow                 = hWnd;
    d3dpp.Windowed                      = false;
    d3dpp.EnableAutoDepthStencil        = TRUE;
    d3dpp.AutoDepthStencilFormat        = D3DFMT_D24X8;
    d3dpp.Flags                         = D3DPRESENTFLAG_DISCARD_DEPTHSTENCIL;
    d3dpp.FullScreen_RefreshRateInHz    = D3DPRESENT_RATE_DEFAULT;
    d3dpp.PresentationInterval          = D3DPRESENT_INTERVAL_IMMEDIATE;

    ShowCursor(FALSE);

    }
    if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,
                                      D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                      &d3dpp, &g_pD3DDevice ) ) )
    {
        return false;
    }

    return true;
}
bool InitScene()
{
    HRESULT     hResult;
    D3DXMATRIX  mProjection;
    float       fAspect;


    // Vertexformat setzen - Positions- und Farbangabe
    if(FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE)))
    {
        // Fehler beim Setzen des Vertexformats!
        MessageBox(hWnd, "Fehler beim setzem des Vertexformates!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
        return false;
    }

    // Beleuchtung und Culling ausschalten, Dithering aktivieren
    g_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    g_pD3DDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    g_pD3DDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);

    // Das Bildseitenverhältnis berechnen
    fAspect =   (float)(640)
              / (float)(480);

    // Die Projektionsmatrix erzeugen
    D3DXMatrixPerspectiveFovLH(&mProjection,
                               D3DXToRadian(90.0f),
                               fAspect,
                               0.1f,
                               100.0f);

    // Projektionsmatrix einsetzen
    g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &mProjection);

    // Initialisieren des Dreiecks
    g_aTriangleVertex[0].vPosition  = D3DXVECTOR3( 0.0f,  1.0f, 0.0f);
    g_aTriangleVertex[1].vPosition  = D3DXVECTOR3( 1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[2].vPosition  = D3DXVECTOR3(-1.0f, -1.0f, 0.0f);
    g_aTriangleVertex[0].dwColor    = D3DXCOLOR(1.0f, 0.0f, 0.0f, 0.0f);
    g_aTriangleVertex[1].dwColor    = D3DXCOLOR(0.0f, 1.0f, 0.0f, 0.0f);
    g_aTriangleVertex[2].dwColor    = D3DXCOLOR(0.0f, 0.0f, 1.0f, 0.0f);

    return true;
}
void Render(float fNumSecPassed)
{
    D3DXMATRIX  mRotation;      // Rotationsmatrix
    D3DXMATRIX  mTranslation;   // Translationsmatrix
    D3DXMATRIX  mWorld;         // Vereinende Weltmatrix


    // Rotations- und Translationsmatrix des Dreiecks erzeugen
    D3DXMatrixRotationY(&mRotation, D3DXToRadian(g_fTime * 90.0f));
    D3DXMatrixTranslation(&mTranslation,0.0f, 0.0f, 2.0f);
    
    // Beide Matrizen kombinieren und als Weltmatrix einsetzen
    mWorld = mRotation * mTranslation;
    g_pD3DDevice->SetTransform(D3DTS_WORLD,&mWorld);

    // -------------------------------------------------------------

    // Den Bildpuffer und den Z-Buffer leeren
    if(FAILED(g_pD3DDevice->Clear(0,
                                            NULL,
                                            D3DCLEAR_TARGET,
                                            D3DCOLOR_XRGB(128, 0, 0),
                                            0.0f,
                                            0)))
    {
        // Fehler beim Leeren!
        MessageBox(hWnd, "Fehler beim Leeren der Puffer!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
    }

    // Szene beginnen
    g_pD3DDevice->BeginScene();

    // Nun das Dreieck zeichnen
    if(FAILED(g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST, // Dreiecksliste
                                                      1,                    // 1 Dreieck
                                                      g_aTriangleVertex,    // Vertexdaten
                                                      sizeof(SVertex))))    // Vertexgröße
    {
        // Fehler beim Zeichnen!
        MessageBox(hWnd, "Fehler beim Zeichnen des Dreiecks!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
    }

    // Szene beenden
    g_pD3DDevice->EndScene();

    // Der große Moment: den Bildpuffer sichtbar machen
    g_pD3DDevice->Present(NULL, NULL, NULL, NULL);


}



Wenn ich in der Zeile:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
if(FAILED(g_pD3DDevice->Clear(0,
                                 NULL,
                                 D3DCLEAR_TARGET,
                                 D3DCOLOR_XRGB(128, 0, 0),
                                 0.0f,
                                 0)))
    {
        // Fehler beim Leeren!
        MessageBox(hWnd, "Fehler beim Leeren der Puffer!",
                   "Fehler", MB_OK | MB_ICONEXCLAMATION);
    }


D3DCLEAR_TARGET noch mit D3DCLEAR_ZBUFFER verknüpfe, dann kommt immer der Fehler, dass es Probleme beim Leeren des Puffers gab!
In David's Beipsiel hat es es Vernüpft. Im DX Tutorial 2 der Doku ist es nicht verknüpft.

ciao
Michael

2

24.01.2004, 19:36

Zitat

D3DCLEAR_TARGET noch mit D3DCLEAR_ZBUFFER verknüpfe, dann kommt immer der Fehler, dass es Probleme beim Leeren des Puffers gab!
In David's Beipsiel hat es es Vernüpft. Im DX Tutorial 2 der Doku ist es nicht verknüpft.
Das liegt einfach daran das du im Fenstermodus keinen Z-Buffer erstellst. Wieso machst du das nicht? Dann ist klar das die Clear-Methode fehlschlaegt. Das duerfte auch der Grund sein warum du im Vollbildmodus kein Dreieck siehst. Es wird einmal gerendert dann sind alle Daten im Z-Buffer geschrieben und das wars dann.

Erstell im Fenstermodus einen Z-Buffer und fuege das D3DCLEAR_ZBUFFER Flag hinzu. Dann sollte alles klappen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

3

24.01.2004, 19:55

@DragonMaster: Danke für deine Antwort.

Einen Z-Buffer erstellt man doch mit:

Quellcode

1
    g_pD3DDevice->SetRenderState(D3DRS_ZENABLE,D3DZB_TRUE);


Die Zeile schreib ich in die InitScene Funktion und man sieht im Vollbildmodus immer noch nichts, wasw nach einem rotierenden Dreieck aussieht!

4

24.01.2004, 20:02

Das ist Z Sortierung du musst bei den PresentParams einen Z Buffer angeben.

5

24.01.2004, 20:10

Das sind diese beiden Zeilen, die du richtig bei der Erstellung des Vollbildmodus angibst.

Quellcode

1
d3dpp.EnableAutoDepthStencil      = TRUE; d3dpp.AutoDepthStencilFormat      = D3DFMT_D24X8;
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

6

24.01.2004, 20:14

Wenn ich die beiden Zeilen beim Fenstermodus angebe, dann sieht man im Fenstermodus auch nur das was ich im Vollbild sehe, also nur ab und zu mal ein paar Pixel, die um die Achse rotieren.

*edit* : mit der Verknüpfung von D3DCLEAR_TARGET mit D3DCLEAR_ZBUFFER bei der Clear Methode sehe ich nur noch die rote Hintergrundfarbe und der eine Fehler ist weg!

7

24.01.2004, 21:05

Wenn ich das DX Tut 2 aus der Doku in meine App einbaue, dann sieht das Dreieck im Fenstermodus so aus :


(Link)



Bei Davids sehe ich nur die Hintergrundfarbe!

8

26.01.2004, 19:17

Mir ist da noch was aufgefallen. In deiner Clear-Methode. Der Wert fuer den Z-Buffer sollte nicht auch 0.0f stehen sondern auf 1.0f. Es sei denn du hast den Algo geendert ;)

Dann sollte es eigentlich klappen.
Wichtig! Ich übernehme keinerlei Verantwortung für eventl. Datenverlust oder Schäden am Rechner ;D

9

26.01.2004, 19:38

Heee, du hast recht! Es lag daran... Besten Dank! :)

Werbeanzeige