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

Sn3aK87

Treue Seele

  • »Sn3aK87« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Freiberg, nähe Dresden

Beruf: Informatikstudent TU Dresden ab 1.10.2007

  • Private Nachricht senden

1

17.02.2007, 21:50

[erledigt]Problem mit Beispielprogramm "Erstes Dreieck&

Hi,

ich bin gerade dabei das Beispielprogramm "erstes Dreieck" mit hilfe des Buches zum laufen zu bringen. Der Einstellungs Dialog läuft ja und er öffnet danach das D3D-Fenster, bricht aber ab und trägt folgenden fehler ins Logbuch:

Zitat

FEHLER:

Der Aufruf von g_pD3DDevice->DrawPrimitiveUP verursachte den DirectX-Fehler D3DERR_INVALIDCALL!

Beschreibung: Invalid call (D3DAbzählung.cpp, Zeile 69, Funktion Render)


Ich habe folgenden Code geschrieben:

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
// Kapitel 2

// Beispielprogramm 02

// ===================

// Auflisten aller Direct3D-Optionen und anschließende Erstellung

// einer Geräteschnittstelle (IDirect3DDevice9).

// Zu den Optionen gehören unter anderem:

// - Adapter und Gerätetyp

// - Videomodi

// - Multi-Sampling-Typen und -Qualitätsstufen

// - Hardware- oder Softwareverarbeitung?


#include <Windows.h>
#include <TriBase.h>
#include "..\\..\\Allgemeines\\InitWindow.h"
#include "..\\..\\Allgemeines\\Direct3DEnum.h"
#include "..\\..\\Allgemeines\\InitDirect3D.h"
#include "Resource.h"

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

// VertexStruct

struct SVertex
{
    tbVector3 vPosition;    //Vertex_Position

    DWORD dwColor;          //Vertex_Farbe

};


SDirect3DParameters g_Direct3DParameters;   // Direct3D-Parameter

float g_fTime;
SVertex g_aTriangleVertex[3];


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

// Render-Funktion

tbResult Render(float fNumSecsPassed)
{
    HRESULT hResult;
    
    //Rotations- und Translationsmatrix des Dreiecks erzeugen

    tbMatrix mRotation(tbMatrixRotationY(TB_DEG_TO_RAD(g_fTime * 90.0f)));
    tbMatrix mTranslation(tbMatrixTranslation(tbVector3(0.0f, 0.0f, 2.0f)));

    //Beide Matrizen kombinieren als Weltmatix einsetzen

    tbMatrix mWorld(mRotation * mTranslation);
    g_pD3DDevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)(&mWorld));

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

    
    //Bildbuffer und Z-Buffer leeren

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

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

    //Scene beginnen

    g_pD3DDevice->BeginScene();

    //Dreieck zeichnen

    if(FAILED(hResult = g_pD3DDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST,
                                                      1,
                                                      g_aTriangleVertex,
                                                      sizeof(SVertex))))
    {
        //Fehler beim Zeichnen

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

    //Szene Beenden

    g_pD3DDevice->EndScene();

    //Der große Moment: Bildbuffer sichtbar machen :)

    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;
}
// ******************************************************************

// InitScene-Funktion

//Die Szene initialisieren - InitScene()

tbResult InitScene()
{
    HRESULT hResult;
    
    //Vertexformat setzen - Positions und Farbangabe

    if(FAILED(hResult = g_pD3DDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE )))
    {
        //Fehler beim setzen des Vertexformats

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

    //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);

    //Initialisieren des Dreiecks

    g_aTriangleVertex[0].vPosition = tbVector3( 0.0f,  1.0f, 0.0f );
    g_aTriangleVertex[0].vPosition = tbVector3( 1.0f, -1.0f, 0.0f );
    g_aTriangleVertex[0].vPosition = tbVector3(-1.0f, -1.0f, 0.0f );
    g_aTriangleVertex[0].dwColor   = tbColor(1.0f, 0.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(0.0f, 1.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(0.0f, 0.0f, 1.0f);

    return TB_OK;
}

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

// Windows-Hauptfunktion

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   char* pcCmdLine,
                   int iShowCmd)
{
    SDirect3DParameters Direct3DParameters;
    tbResult            Result;


    // TriBase-Engine initialisieren

    tbInit();

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

    Result = GetDirect3DParameters(&Direct3DParameters);
    if(Result == TB_ERROR)
    {
        // Es trat ein Fehler auf!

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

        tbExit();
        return 0;
    }

    // Fenster initialisieren. Die Größe hängt vom gewählten

    // Videomodus ab, der in der Parameterstruktur gespeichert ist.

    if(InitWindow(Direct3DParameters.VideoMode.Width,
                  Direct3DParameters.VideoMode.Height,
                  "Beispielprogramm Nr. 2: Direct3D-Abzählung",
                  LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON1))))
    {
        // 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(&Direct3DParameters,
                    g_hWindow))
    {
        // Fehler!

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

    // Nachrichtenschleife

    tbDoMessageLoop(Render, Move);

    



    // Direct3D und Fenster herunterfahren

    ExitDirect3D();
    ExitWindow();

    // Engine herunterfahren

    tbExit();

    return 0;
}

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


Ich danke euch schon mal für die Hilfe!!! :)

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

17.02.2007, 21:53

Re: Problem mit Beispielprogramm "Erstes Dreieck"

Zitat von »"Sn3aK87"«

C-/C++-Quelltext

1
2
3
4
5
6
7
    //Initialisieren des Dreiecks

    g_aTriangleVertex[0].vPosition = tbVector3( 0.0f,  1.0f, 0.0f );
    g_aTriangleVertex[0].vPosition = tbVector3( 1.0f, -1.0f, 0.0f );
    g_aTriangleVertex[0].vPosition = tbVector3(-1.0f, -1.0f, 0.0f );
    g_aTriangleVertex[0].dwColor   = tbColor(1.0f, 0.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(0.0f, 1.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(0.0f, 0.0f, 1.0f);

Was fällt auf?

Sn3aK87

Treue Seele

  • »Sn3aK87« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Freiberg, nähe Dresden

Beruf: Informatikstudent TU Dresden ab 1.10.2007

  • Private Nachricht senden

3

17.02.2007, 21:58

Re: Problem mit Beispielprogramm "Erstes Dreieck"

Zitat von »"David Scherfgen"«

Zitat von »"Sn3aK87"«

C-/C++-Quelltext

1
2
3
4
5
6
7
    //Initialisieren des Dreiecks

    g_aTriangleVertex[0].vPosition = tbVector3( 0.0f,  1.0f, 0.0f );
    g_aTriangleVertex[0].vPosition = tbVector3( 1.0f, -1.0f, 0.0f );
    g_aTriangleVertex[0].vPosition = tbVector3(-1.0f, -1.0f, 0.0f );
    g_aTriangleVertex[0].dwColor   = tbColor(1.0f, 0.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(0.0f, 1.0f, 0.0f);
    g_aTriangleVertex[0].dwColor   = tbColor(0.0f, 0.0f, 1.0f);

Was fällt auf?


OKAY danke für die sehr schnelle antwort^^ die nullen hab ich bestimmt beim kopieren vergessen zu öndern :oops:

*EDIT* geht trotzdem nicht :( << Gleicher Log Fehler siehe oben!!

Liegt es vielleicht daran dass ich nicht extra eine "initApplication()" einbaue?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

17.02.2007, 22:09

Du rufst "InitScene" nirgendwo auf.
Also wird der Code darin auch nicht ausgeführt.

Sn3aK87

Treue Seele

  • »Sn3aK87« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Freiberg, nähe Dresden

Beruf: Informatikstudent TU Dresden ab 1.10.2007

  • Private Nachricht senden

5

17.02.2007, 22:31

Zitat von »"David Scherfgen"«

Du rufst "InitScene" nirgendwo auf.
Also wird der Code darin auch nicht ausgeführt.


ich hab die initScene() jetzt vor die MessageLoop wo Render und Move abgehandelt werden aufgerufen ... er öffnet zwar jetzt das fenster, jedoch zeichnet er kein dreieck :(

6

17.02.2007, 23:16

Je nachdem was du angibst wird das Dreieck wegrationalisiert da es sich von der kamera wegneigt. Tausch mal den Index von 1 und 2. Damit drehst du die Richtung um. Nur falls es daran liegen sollte.

Sn3aK87

Treue Seele

  • »Sn3aK87« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Freiberg, nähe Dresden

Beruf: Informatikstudent TU Dresden ab 1.10.2007

  • Private Nachricht senden

7

17.02.2007, 23:27

Zitat von »"chriss"«

Je nachdem was du angibst wird das Dreieck wegrationalisiert da es sich von der kamera wegneigt. Tausch mal den Index von 1 und 2. Damit drehst du die Richtung um. Nur falls es daran liegen sollte.


ne daran lags nicht, ich hab es jetzt hinbekommen indem ich mir die Buch-Datei hinzugezogen habe... es lag daran, dass ich die Projectionsmatrix nicht erstellt habe... woran es noch lag hab i bisher noch ne rausgefunden...

Werbeanzeige