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

01.10.2009, 13:01

Aufgabe 2_6 a)

Suche jetzt schon seit ein paar Stunden den Fehler in meinem Programmcode, da mir kein Dreieck angezeigt wird, und finde ihn iwi nicht!

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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
/*  Schreiben Sie ein Programm, das ein einzelnes statisches Dreieck rendert, das
    mit einer Textur überzogen ist. Die Textur soll dabei ohne Verzerrungen auf 
    dem Dreieck abgebildet sein.
*/

#include <D3D9.H>
#include <TRIBASE.H>
#include "InitWindow.h"
#include "Direct3DEnum.h"
#include "InitDirect3D.h"
#include "Resource.h"

#define D3D_DEBUG_INFO

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

// Vertex-Struktur

struct SVertex
{
    tbVector3           vPosition;  // Positions des Vertex

    DWORD               dwColor;    // Farbe des Vertex

    tbVector2           vTexture;   // Texturkoordinaten (nach Farbe des Vertex!!!)

    static const DWORD  dwFVF;      // Vertexformat

};
const DWORD SVertex::dwFVF = D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX1;

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

// Struktur für statische Dreiecke

struct STriangle
{
    tbVector3   vPosition;  // Position des Dreiecks

    // Keine Bewegung, Rotation, Rotationszustand!

    DWORD       dwColor;    // Farbe des Dreiecks

    float       fSize;      // Größe

    SVertex     aVertex[3]; // Die 3 Vertizes des Dreiecks

};

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

// Globale Variablen

const int           g_iNumTriangles = 1;            // Legt die Anzahl der zu erzeugenden Dreiecke fest

float               g_fTime = 0.0f;                 // globale Zählervariable, die für die Animation benutzt wird

SDirect3DParameters g_Direct3DParameters;           // Variable vom Struktur-Typ SDirect3DParameters, die alle Daten zur Initialisierung von Direct3D enhält

STriangle           g_aTriangle[g_iNumTriangles];   // Array vom Struktur-Typ SVertex in der ein Objekt(Dreieck) gespeichert wird

PDIRECT3DTEXTURE9   g_pTexture = NULL;              // Texturzeiger


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

// Initialisieren der Szene

tbResult InitScene()
{
    HRESULT     hResult;
    tbMatrix    mProjection;
    float       fAspect;
    tbColor     VertexColor;

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

    // Vertexformat sezten - Positions- und Farbangabe

    if (FAILED(hResult = g_pD3DDevice->SetFVF(SVertex::dwFVF)))
    {
        // Fehler beim Setzen des Vertexformats!

        TB_ERROR_DIRECTX("g_pD3DDevice->SetFVF", hResult, TB_ERROR);
    }

    // Beleuchtung & Culling ausschalten, Dithering aktivieren

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

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

    // Transformationspipeline Teil 1: Die Projektionsmatrix

    // Das Bildseitenverhältnis berechnen

    fAspect =     (float)(g_Direct3DParameters.VideoMode.Width)
                / (float)(g_Direct3DParameters.VideoMode.Height);

    // Die Projektionsmatrix erstellen

    mProjection = tbMatrixProjection(   TB_DEG_TO_RAD(90.0f),   // Sichtfeld: 90° (=180°)

                                        fAspect,                // Bildseitenverhältnis 

                                        0.1f,                   // Nahe Clipping-Ebene

                                        100.0f);                // Ferne Clipping-Ebene


    // Projektionsmatrix einsetzen

    g_pD3DDevice->SetTransform( D3DTS_PROJECTION,               // Transformationstype

                                (D3DMATRIX*)(&mProjection));    // Zeiger auf eine Matrix


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

    // Initialisieren des/der Dreiecks(e)

    for (int iTriangle = 0; iTriangle < g_iNumTriangles; iTriangle++)
    {
        // Dreieck(e) auf Startpunkt sezten

        g_aTriangle[iTriangle].vPosition = tbVector3(0.0f, 0.0f, 10.0f);
        
        // Keine Bewegung

        // Kein Rücksetzten der Rotation

        // Keine Rotationsgeschwindigkeit


        // Größe des(r) Dreiecks(e) festlegen

        g_aTriangle[iTriangle].aVertex[0].vPosition = tbVector3(-1.0f, -1.0f, 0.0f);
        g_aTriangle[iTriangle].aVertex[1].vPosition = tbVector3(0.0f, 1.0f, 0.0f);
        g_aTriangle[iTriangle].aVertex[2].vPosition = tbVector3(1.0f, -1.0f, 0.0f);

        // Einzelnen Vertizes des Dreiecks generieren

        for (int iVertex = 0; iVertex < 3; iVertex++)
        {
            // Vertex-Farben

            VertexColor.r = tbFloatRandom(0.0f, 1.0f);
            VertexColor.g = tbFloatRandom(0.0f, 1.0f);
            VertexColor.b = tbFloatRandom(0.0f, 1.0f);

            // Dem Dreieck die Vertex-Farben zuweisen

            g_aTriangle[iTriangle].aVertex[iVertex].dwColor = (DWORD)(VertexColor);
        }
                    // Texturkoordinaten erzeugen

            g_aTriangle[iTriangle].aVertex[0].vTexture.u = 0.5f;
            g_aTriangle[iTriangle].aVertex[0].vTexture.v = 0.0f;
            g_aTriangle[iTriangle].aVertex[1].vTexture.u = 1.0f;
            g_aTriangle[iTriangle].aVertex[1].vTexture.v = 1.0f;
            g_aTriangle[iTriangle].aVertex[2].vTexture.u = 0.0f;
            g_aTriangle[iTriangle].aVertex[2].vTexture.v = 1.0f;
    }

    // Textur laden

    if(FAILED(hResult = D3DXCreateTextureFromFileEx(g_pD3DDevice,       // Device

                                                    "Texture.bmp",      // Dateiname

                                                    D3DX_DEFAULT,       // Breite

                                                    D3DX_DEFAULT,       // Höhe

                                                    D3DX_DEFAULT,       // MIP-Maps

                                                    0,                  // Verwendungszweck

                                                    D3DFMT_UNKNOWN,     // Format

                                                    D3DPOOL_MANAGED,    // Speicherklasse

                                                    D3DX_FILTER_NONE,   // Filter

                                                    D3DX_DEFAULT,       // MIP-Map-Filter

                                                    0,                  // Color-Key

                                                    NULL,               // Unwichtig

                                                    NULL,               // Unwichtig

                                                    &g_pTexture)))      // Die Textur

    {
        // Fehler!

        TB_ERROR_DIRECTX("D3DXCreateTextureFromFileEx", hResult, TB_ERROR);
    }

    // Und nun die Textur einsetzen

    g_pD3DDevice->SetTexture(0, g_pTexture);

    return TB_OK;
}

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

// Render-Funktion

tbResult Render (float fNumSecsPassed)
{
    // *****************************************************

    HRESULT     hResult;
    
    // *****************************************************

    // Bildpuffer & Z-Stencil-Buffer lehren:

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

        TB_ERROR_DIRECTX("g_pD3DDevice->Clear", hResult, TB_STOP);
    }

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

    // Beginn der Szene:

    if (FAILED(hResult = g_pD3DDevice->BeginScene()))
    {
        // Fehler beim Starten der Szene!

        TB_ERROR_DIRECTX("g_pD3DDevice->BeginScene", hResult, TB_STOP);
    }
    
    // z.B.: Maximaler anisotropischer Filter mit linearem MIP-Mapping

    // Setzen des des SamplerStates für maximalen Anisotropischen Filter

    g_pD3DDevice->SetSamplerState(  0, 
                                    D3DSAMP_MAXANISOTROPY,
                                    g_Direct3DParameters.DeviceCaps.MaxAnisotropy);

    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
    g_pD3DDevice->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);

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

    // Jedes einzelne Dreieck zeichnen

    for(int iTriangle = 0; iTriangle < g_iNumTriangles; iTriangle++)
    {   
        if (FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP( 
                                        D3DPT_TRIANGLELIST,             // Dreiecksliste

                                        g_iNumTriangles,                // 1 Dreieck

                                        g_aTriangle[iTriangle].aVertex, // Vertizes

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

        {
            // Fehler beim Zeichnen!

            TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult,  TB_STOP);
        }
    }
    // *****************************************************

    // Beenden der Szene

    g_pD3DDevice->EndScene();

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

    // Den Bildpuffer anzeigen

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

    return TB_OK;
}

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

// Move-Funktion

tbResult Move (float fNumSecsPassed)
{
    // Zeitzähler erhöhen

    // g_fTime += fNumSecsPassed;


    return TB_OK;
}


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

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

// Windows-Hauptfunktion

int WINAPI WinMain( HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int nShowCmd)
{
    tbResult Result;

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

    // Tribase-Engine Initialisieren

    if (tbInit())
    {
        // Fehler

        return 1;
    }
    
    // *****************************************************

    // Direct3D-Optionen abfragen (vom Benutzer gewählt)

    Result = GetDirect3DParameters (&g_Direct3DParameters);
    if (Result == TB_ERROR)
    {
        // Fehler

        MessageBox( NULL, 
                    "Fehler beim Abzählen!", 
                    "Fehler", 
                    MB_OK | MB_ICONEXCLAMATION);
    }
    else if (Result == TB_CANCELED)
    {
        // Der Dialog wurde abgebrochen!

        tbExit();
        return 0;
    }

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

    // Fenster initialisieren - Größe hängt vom zuvor gewählten Videomodus ab

    if (InitWindow( g_Direct3DParameters.VideoMode.Width,
                    g_Direct3DParameters.VideoMode.Height,
                    "Übungsbeispiel 2.5: Rotierendes Dreieck",
                    NULL))
    {
        // Fehler beim Erstellen des Fensters

        MessageBox( NULL,
                    "Fehler beim Erstellen des Fensters!",
                    "Fehler",
                    MB_OK | MB_ICONEXCLAMATION);
        tbExit();
        return 1;
    }
    
    // *****************************************************

    // Direct3D mit den abgefragten Einstellungen initialisieren

    if (InitDirect3D(&g_Direct3DParameters, g_hWindow))
    {
        // Fehler!

        MessageBox( NULL,
                    "Fehler beim Initialisieren von Direct3D!",
                    "Fehler",
                    MB_OK | MB_ICONEXCLAMATION);
        ExitWindow();
        tbExit();
        return 1;
    }

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

    // Initialisieren der Szene

    InitScene();

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

    // Nachrichtenschleife

    tbDoMessageLoop(Render, Move);

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

    // Textur deaktivieren und löschen

    g_pD3DDevice->SetTexture(0, NULL);
    TB_SAFE_RELEASE(g_pTexture);

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

    // Direct3D & Fenster herunterfahren

    ExitDirect3D();
    ExitWindow();

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

    // Tribase-Engine herunterfahren

    tbExit();

    return 0;
}
// ***********************************************************************************

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

2

01.10.2009, 13:03

Was steht in der Log.html?
fka tm

3

01.10.2009, 13:06

INFO: TriBase-Engine wird initialisiert... (tribase.cpp, Zeile 86, Funktion tbInit)

INFO: Initialisierung komplett! (tribase.cpp, Zeile 104, Funktion tbInit)

INFO: Fensterklasse wurde registriert! (initwindow.cpp, Zeile 31, Funktion InitWindow)

INFO: Fenster wurde erstellt! (initwindow.cpp, Zeile 57, Funktion InitWindow)

INFO: IDirect3D9-Schnittstelle wurde erzeugt! (initdirect3d.cpp, Zeile 28, Funktion InitDirect3D)

INFO: Geräteschnittstelle wurde generiert! (initdirect3d.cpp, Zeile 61, Funktion InitDirect3D)

INFO: Nachrichtenschleife wird betreten... (tribase.cpp, Zeile 179, Funktion tbDoMessageLoop)

INFO: Nachrichtenschleife beendet! (tribase.cpp, Zeile 247, Funktion tbDoMessageLoop)

INFO: Fensterkomponente wurde heruntergefahren! (initwindow.cpp, Zeile 69, Funktion ExitWindow)

INFO: TriBase-Engine wird heruntergefahren... (tribase.cpp, Zeile 113, Funktion tbExit)

INFO: Alle Speicherbereiche freigegeben! (tbmemory.cpp, Zeile 116, Funktion tbMemExit)

INFO: Herunterfahren abgeschlossen! (tribase.cpp, Zeile 149, Funktion tbExit)

4

01.10.2009, 13:36

Das sieht schon mal gut aus.

Der Dialog zum Festlegen der Parameter (Auflösung etc.) erscheint?

Gerendert wird auf jeden Fall was?
Also ein weißer Hintergrund ist zu sehen?

Ich würde mal eine andere Hintergrundfarbe nehmen, Dunkelgrau z.B.:

D3DCOLOR_XRGB(50,50,50)
(Parameter von g_pD3DDevice->Clear)

Und das Dreieck etwas nach vorne bewegen (positive Z-Achse):

C-/C++-Quelltext

1
2
3
g_aTriangle[iTriangle].aVertex[0].vPosition = tbVector3(-1.0f, -1.0f, 5.0f); // 5 statt 0

g_aTriangle[iTriangle].aVertex[1].vPosition = tbVector3(0.0f, 1.0f, 5.0f);
g_aTriangle[iTriangle].aVertex[2].vPosition = tbVector3(1.0f, -1.0f, 5.0f); 
fka tm

5

01.10.2009, 14:00

Zitat

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    // *****************************************************

    // Jedes einzelne Dreieck zeichnen

    for(int iTriangle = 0; iTriangle < g_iNumTriangles; iTriangle++)
    {   
        if (FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(   
                                        D3DPT_TRIANGLELIST,                // Dreiecksliste

                                        g_iNumTriangles,                // 1 Dreieck

                                        g_aTriangle[iTriangle].aVertex,    // Vertizes

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

        {
            // Fehler beim Zeichnen!

            TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult,  TB_STOP);
        }
    } 

müsste in diesem Fall nicht das 2. Parameter von DrawPrimitive UP 1 sein, statt die Anzahl der Gesamten Triangle-Objekte.Also:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  // *****************************************************

    // Jedes einzelne Dreieck zeichnen

    for(int iTriangle = 0; iTriangle < g_iNumTriangles; iTriangle++)
    {   
        if (FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(   
                                        D3DPT_TRIANGLELIST,                // Dreiecksliste

                                        1,                // 1 Dreieck

                                        g_aTriangle[iTriangle].aVertex,    // Vertizes

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

        {
            // Fehler beim Zeichnen!

            TB_ERROR_DIRECTX("g_pD3DDevice->DrawPrimitiveUP", hResult,  TB_STOP);
        }
    }

[/cpp]

6

01.10.2009, 14:06

Ist doch 1:

C-/C++-Quelltext

1
const int g_iNumTriangles = 1;   // Legt die Anzahl der zu erzeugenden Dreiecke fest 
fka tm

7

01.10.2009, 14:11

Aber wenn er mehr Dreiecke erzeugen will, schraubt er ja NumTriangles hoch. Und wenn dann ist NumTriangles ja nicht 1

Bsp. NumTriangles = 4 -> 4 Triangle Objekte werden erzeugt -> DrawPrimitiveUp wird als Anzahl der Zu zeichnenden Primitiven 4 Übergeben (pro TriangleObjekt)

Edit: Les grad, dass man für die Aufgabe ja nur 1 Dreieck brauch :oops:
Edit 2: Hat er überhaupt eine Weltmatrix gesetzt ?

8

01.10.2009, 22:26

@ TrikkieMikkie:
Hast recht, wenn ich das Dreieck etwas in die z-Ebene verlege, kann ichs sehen.
Schätz mal das ich zuvor, wegen der nahen Clipping-Ebene, hindurch gesehen habe!

@E122:
1. Stimmt, der 2. Parameter von DrawPrimitivUP() sollte fix 1 sein und nicht der Wert der globalen Variable für die Anzahl der Dreiecke!

2. Wenn ich keine Translation, Rotation, Skalierung ausführe, brauche ich doch auch keine Weltmatrix, oder?

---------------------------------
Auf jeden Fall funktioniert das Bsp. jetz!
Danke für die schnellen Antworten!

greez

Werbeanzeige