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

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

1

10.12.2010, 22:58

Engine Fehler beim initialisieren

Hi

Ich habe mir einige Funktionen geschrieben, welche die besten Einstellungen für die PresentParamters auswählen. Eine Funktion fasst alle zusammen und hat im Parameter einen Zeiger auf die Struktur veConfig. In der Hauptanwendung rufe ich diese Funktion auf und übergebe der Funktion eine Instanz der Struktur veConfig. Diese wird mittels dem Kaufmännischem Und (&) gefüllt. Soweit funktioniert alles, doch dann rufe ich die Funktion Init auf, bei der Direct3D initialisiert wird und da werden ebenfalls die PresentParameters gesetzt, diese werden mit dem Zeiger von der Struktur veConfig, welcher im Parameter übergeben wird gesetzt.

Hier ist ein Codeausschnitt:

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
veResult veConfigDialog::veCallConfigDialog(veConfig * pOut)
{
LowDetailMode = false;
MediumDetailMode = false;
HighDetailMode = true;

// Den globalen Zeiger auf die Struktur setzen, damit sie später
// gefüllt werden kann.
g_pConfig = pOut;

// Eine IDirect3D9-Schnittstelle generieren, die für die Abzählung gebraucht wird.
g_pD3D = Direct3DCreate9(D3D_SDK_VERSION);
if(!g_pD3D)
{
// Fehler!
MessageBox(NULL, "Die IDirect3D9-Schnittstelle konnte nicht generiert werden! DirectX 9 oder höher wird benötigt!", "Fehler", MB_OK | MB_ICONEXCLAMATION);
}

CheckBestDeviceType(pOut);
CheckBestResolution(pOut);
CheckBestBackBufferFormat(pOut);
CheckBestZStencilBufferFormat(pOut);
CheckBestMultiSampleType(pOut);
CheckBestMultiSampleQuality(pOut);

return VE_OK;
}

veResult veScene::Init(veConfig * pConfig, char * pcWindowTitle)
{
// -----------------------------------------------------------------------------------
// Direct3D initialisieren
// -----------------------------------------------------------------------------------

// Variablen deklarieren
HRESULThResult;// Ist die Funktion erfolgreich oder nicht?
D3DPRESENT_PARAMETERSPresentParams;// PresentParamters für Direct3D
WNDCLASSEXwc;// WNDCLASSEX-Struktur Variable um die Struktur zu füllen

if(!pConfig)
{
MessageBox(NULL, "Der erste Parameter der Funktion Init() ist leer", "Fehler aufgetreten",
   MB_OK | MB_ICONEXCLAMATION);

return VE_ERROR;
}

ZeroMemory(&wc, sizeof(WNDCLASSEX));

wc.style = CS_HREDRAW | CS_VREDRAW;
wc.cbSize = sizeof(WNDCLASSEX);
wc.hInstance = ve_g_DLLHandle;
wc.lpfnWndProc = WndProc;
wc.cbWndExtra = 0;
wc.cbClsExtra = 0;
wc.lpszClassName = "VisualEngine";
wc.lpszMenuName = NULL;
wc.hbrBackground = HBRUSH(GetStockObject(BLACK_BRUSH));
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

if(!RegisterClassEx(&wc))
{
MessageBox(NULL, "Fehler beim Registrieren des Fensters", "Fehler aufgetreten",
   MB_OK | MB_ICONEXCLAMATION);

return VE_ERROR;
}

int Width = pConfig->VideoMode.Width;
int Height = pConfig->VideoMode.Height;
RECT Rect;
SetRect(&Rect, 0, 0, Width, Height);
AdjustWindowRect(&Rect, WS_VISIBLE | WS_OVERLAPPEDWINDOW, FALSE);
Width = Rect.right - Rect.left;
Height = Rect.bottom - Rect.top;

// Fenster erzeugen
m_hwnd = CreateWindow("VisualEngine",
  pcWindowTitle,
  WS_VISIBLE | WS_OVERLAPPEDWINDOW,
  GetSystemMetrics(SM_CXSCREEN) / 2 - Width / 2,
  GetSystemMetrics(SM_CYSCREEN) / 2 - Height / 2,
  Width,
  Height,
  NULL,
  NULL,
  ve_g_DLLHandle,
  NULL);

if(!m_hwnd)
{
MessageBox(NULL, "Fehler beim Erstellen des Fensters", "Fehler aufgetreten",
   MB_OK | MB_ICONEXCLAMATION);

return VE_ERROR;
}

// Direct3D Schnittstelle erzeugen
m_pD3D = Direct3DCreate9(D3D_SDK_VERSION);

ZeroMemory(&PresentParams, sizeof(D3DPRESENT_PARAMETERS));
PresentParams.BackBufferWidth= pConfig->VideoMode.Width;
PresentParams.BackBufferHeight= pConfig->VideoMode.Height;
PresentParams.BackBufferFormat= pConfig->BackBufferFormat;
PresentParams.BackBufferCount= 1;
PresentParams.MultiSampleType= pConfig->MultiSamplingType;
PresentParams.MultiSampleQuality= pConfig->dwMultiSamplingQuality;
PresentParams.SwapEffect= D3DSWAPEFFECT_DISCARD;
PresentParams.hDeviceWindow= m_hwnd;
PresentParams.Windowed= pConfig->bWindowed;
PresentParams.EnableAutoDepthStencil= TRUE;
PresentParams.AutoDepthStencilFormat= pConfig->ZStencilBufferFormat;
PresentParams.Flags= NULL;
PresentParams.FullScreen_RefreshRateInHz= pConfig->VideoMode.RefreshRate;
PresentParams.PresentationInterval= D3DPRESENT_INTERVAL_IMMEDIATE;

// IDirect3DDevice-Schnittstelle erzeugen
if(FAILED(hResult = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
 pConfig->DeviceType,
 m_hwnd,
 D3DCREATE_SOFTWARE_VERTEXPROCESSING,
 &PresentParams,
 &m_pD3DDevice)))
{
MessageBox(NULL, "Fehler beim erstellen der IDirect3DDevice-Schnittstelle", "Fehler aufgetreten",
   MB_OK | MB_ICONEXCLAMATION); // Diese Fehlermeldung wird aufgerufen.

return VE_ERROR;
}

// .......
}






// Hauptprogramm
//

veConfig g_Config;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
   LPSTR lpCmdLine, int nShowCmd)
{
// Instanz von veDirect3D erstellen

veInit();

pConfig = new veConfigDialog();

pConfig->veCallConfigDialog(&g_Config);

Scene.Init(&g_Config, "VisualEngine");

if(Scene.GetInput() == VE_ERROR)
{
MessageBox(NULL, "GetInput()", "Fehler aufgetreten",
   MB_OK | MB_ICONEXCLAMATION);
}

D3DXMATRIX matProjection;

D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(0.0f, 20.0f, 8.0f),
 &D3DXVECTOR3(0.0f, 0.0f, 0.0f),
 &D3DXVECTOR3(0.0f, 1.0f, 0.0f));

Scene->SetTransform(D3DTS_VIEW, &matView); // Hier tretet der Fehler auf, da das erste mal m_pD3DDevice verwendet wird.

// .....
}


Ist ein Fehler bei den PresentParameters oder wo ist der Fehler?

Den PresentParamters werden folgende Werte übergeben:

DeviceType = D3DDEVTYPE_HAL
bWindowed = 0
BackBufferWidth: 1920
BackBufferHeight: 1200
RefreshRate: 60
BackBufferFormat = D3DFMT_X8R8G8B8
ZStencilBufferFormat = D3DFMT_D24X8
MultiSamplingType = D3DMULTISAMPLE_8_SAMPLES
dwMultiSamplingQuality = 3

Kann mir jemand sagen, was ich hier falsch gemacht habe?

LG Patrick

Ashnarott

Frischling

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

2

11.12.2010, 00:28

Hi,
am besten ist du wertest HRESULT aus, damit man genau weiß wegen was DirectX meckert.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// IDirect3DDevice-Schnittstelle erzeugen
if(FAILED(hResult = m_pD3D->CreateDevice(D3DADAPTER_DEFAULT,
                     pConfig->DeviceType,
                     m_hwnd,
                     D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                     &PresentParams,
                     &m_pD3DDevice)))
{
    char    acErrorBuffer[512];
    
    //Fehlermeldung abfragen und in das Char - Array speichern...
    sprintf(acErrorBuffer, "Fehler beim erstellen der IDirect3DDevice-Schnittstelle\nErrorString: %s\nErrrorDesc: %s", (char*)(DXGetErrorString(hResult)), (char*)(DXGetErrorDescription(hResult))); 

    //Meldung ausgeben...
    MessageBox(NULL, acErrorBuffer, "Fehler aufgetreten",
            MB_OK | MB_ICONEXCLAMATION); // Diese Fehlermeldung wird aufgerufen.

    return VE_ERROR;
}


Du musst dafür noch "dxerr.h" includen und die LIB "dxerr.lib" mit linken lassen. Poste dann die Fehlermeldung, wenn du dadurch immer noch nicht auf den Fehler kommst ;)

Die anderen Fehler treten dadurch auf das Direct3DDevice9 noch nicht initialisiert wurde. Es kommt
zu einem Speicherfehler, weil du auf einen NULL-Pointer zugreifen willst. Mit leerem Tank kann man ja auch nicht Auto fahren :D

Ich hoffe das hilft,

mfg,

Ashnarott
Traue einem Computer, aber niemals seinen Programmierer!!!

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

3

11.12.2010, 01:15

Danke für die Antwort.

Nun kommt folgende Meldung in der MessageBox:

Fehler beim erstellen der IDirect3DDevice-Schnittstelle
ErrorString: D3DERR_INVALIDCALL
ErrorDesc: InvalidCall

Ich habe bereits auf Google geschaut aber nicht gescheites gefunden. Ich weiss nicht was ich mit dieser Fehlermeldung anfangen soll.

Ashnarott

Frischling

Beiträge: 57

Beruf: Student Maschinenbau

  • Private Nachricht senden

4

11.12.2010, 11:49

D3DINVALID_CALL bedeutet das in PresentParameters irgendein Wert nicht kompatibel mit deiner Hardware ist oder nicht kompatibel mit einer anderen Einstellung. Ich würde stark auf Multisampling bzw die Bildwiederholungsrate tippen.
Probier mal das:

C-/C++-Quelltext

1
2
3
    mPresentParams.MultiSampleType                  =   D3DMULTISAMPLE_NONE;
    mPresentParams.MultiSampleQuality               =   0;
    mPresentParams.FullScreen_RefreshRateInHz       =   D3DPRESENT_RATE_DEFAULT;


Wenn das funktioniert musst du irgendwo in deinen Funktionen die nach den besten Einstellungen suchen einen Fehler haben.

Edit:
Ich seh grad du benutzt die Auflösung 1920 x 1200. Ich weiß nicht was für einen Bildschirm du hast, aber normalerweise ist das 1920 x 1080 (Full HD). Könnte auch daran liegen ;)
Traue einem Computer, aber niemals seinen Programmierer!!!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Ashnarott« (11.12.2010, 12:13)


Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

5

11.12.2010, 12:19

Danke für deine Antwort, du hast recht, ich habe es bereits herausgefunden.

Ich habe in der Funktion, bei der die Quality des Multisampling ausgewählt wird, ein Minus 1 vergessen zu schreiben. Denn sie gab mir eine Quality zu hoch, nämlich 3 und meine Hardware unterstützt nur Stufe 2.

LG Patrick

verrueckt1993

Frischling

Beiträge: 85

Beruf: Informationstechnischer Assistent Fachrichtung AE, 2. Jahr

  • Private Nachricht senden

6

12.12.2010, 01:42

1920 x 1200 ist 16:10, 1920x1080 ist 16:9, also beides völlig ok.

Werbeanzeige