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

24.11.2010, 21:21

IDirect3DDevice Schnittstellen Problem

Hi

Ich bin daran an einer DLL zu programmieren. Ich habe eine Init Funktion für Direct3D geschrieben und da habe ich auch ein neues Device Object erzeugt.

Hier ist 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
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
veResult veDirect3D::Init(bool bWindowed, char * pcWindowTitle, HINSTANCE hInstance)
{
    // -----------------------------------------------------------------------------------
    // Direct3D initialisieren
    // -----------------------------------------------------------------------------------

    // Variablen deklarieren
    HRESULT                     hResult;            // Ist die Funktion erfolgreich oder nicht?
    D3DPRESENT_PARAMETERS       PresentParams;      // PresentParamters f¸r Direct3D
    D3DDISPLAYMODE              VideoMode;          // Struktur ausf¸llen
    WNDCLASSEX                  wc;                 // WNDCLASSEX-Struktur Variable um die Struktur zu f¸llen

    ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.hInstance = hInstance;
    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;
    }

    // Fenster erzeugen
    m_hwnd = CreateWindow("VisualEngine",
                          pcWindowTitle,
                          WS_VISIBLE | WS_OVERLAPPEDWINDOW,
                          GetSystemMetrics(SM_CXSCREEN) / 2,
                          GetSystemMetrics(SM_CYSCREEN) / 2,
                          800,
                          600,
                          NULL,
                          NULL,
                          hInstance,
                          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);

    m_pD3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &VideoMode);

    ZeroMemory(&PresentParams, sizeof(D3DPRESENT_PARAMETERS));

    // Presentations-Parameter setzen
    PresentParams.hDeviceWindow = m_hwnd;
    PresentParams.BackBufferCount = 1;
    PresentParams.BackBufferFormat = D3DFMT_X8R8G8B8;
    PresentParams.BackBufferWidth = 800;
    PresentParams.BackBufferHeight = 600;
    PresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
    PresentParams.EnableAutoDepthStencil = true;
    PresentParams.AutoDepthStencilFormat = D3DFMT_D16;
    PresentParams.Windowed = bWindowed;
    PresentParams.MultiSampleQuality = NULL;
    PresentParams.MultiSampleType = D3DMULTISAMPLE_NONE;
    PresentParams.Flags = NULL;
    PresentParams.FullScreen_RefreshRateInHz = VideoMode.RefreshRate;
    PresentParams.PresentationInterval = NULL;

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

        return VE_ERROR;
    }

    // PresentParams der private Variable ¸bergeben
    m_PresentParams = PresentParams;

    // Anzahl der RenderObjekte auf 0 setzen
    m_NumRenderObjects = 0;

    // Alle RenderObjekte auf false setzen
    for(int iRenderObject = 0; iRenderObject < 10000; iRenderObject++)
    {
        m_RenderObjects[iRenderObject].IsRenderObject = false;
        m_RenderObjects[iRenderObject].RenderObjectType = VE_NONE;
    }

    // Direct3D wurde initialisiert, also Variable auf True setzen.
    m_bInitialized = true;

    return VE_OK;
}


Hier ist der Funktionsaufruf von der Init-Funktion

C-/C++-Quelltext

1
D3D.Init(true, "VisualEngine", hInstance);


Wenn ich das Programm ausführe, dann kommt, die MessageBox-Meldung, "Fehler beim erstellen der IDirect3DDevice-Schnittstelle". Was habe ich falsch gemacht?

LG Patrick

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

2

25.11.2010, 07:50

Falsch gemacht hast du, dass du dir nicht den Rückgabewert von CreateDevice() genauer angeguckt hast und dann natürlich noch, dass du nicht die Debug-Runtime benutzt ;)

Also: Welchen Wert gibt CreateDevice() denn zurück und was sagt die Debug-Runtime ?

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

3

25.11.2010, 11:32

Der Rückgabetyp von CreateDevice() ist HRESULT. Wie kann ich denn auf Visual C++ Express 2010 die Debug Runtime verwenden?

Zuvor ging dieser Aufruf von CreateDevice() in all meinen Direct3D Projekten. Vielleicht ist ein Wert einer Variable, welche ich in den Parametern übergebe, nicht richtig.

MCP

Alter Hase

Beiträge: 513

Wohnort: Paderborn

Beruf: Software-Entwickler

  • Private Nachricht senden

4

25.11.2010, 11:43

Was ist denn der Wert von hResult? Das es vom Typ HRESULT ist, ist soweit klar. ;)

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

25.11.2010, 11:49

Die Debug-Runtime benutzt du unter VS Express genau so, wie mit allen anderen IDEs. Das DirectX Control Center starten und da dann die Debug Runtime auswählen.

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

6

25.11.2010, 11:50

Die Device-Erstellung geht schief, wenn einer der PresentationParams nicht passt. In Deinem Fall sieht eigentlich alles valide aus, außer vielleicht die RefreshRate, die Du angibst. Wenn das System keine 800x600 mit dieser RefreshRate kann, scheitert die Device-Erstellung auch. Daher zwei Empfehlungen:

a) Benutze anstatt einer explizit angegebenen RefreshRate erstmal 0. Das ist eh Pflicht für Windowed == true, und schadet bei Fullscreen nicht... glaube ich.

b) Aktiviere die Direct3D Debug Runtime. Startmenü -> Microsoft DirectX SDK -> DirectX Utilities -> DirectX Control Panel -> "Use Debug Version of DirectX Runtimes". Danach müsstest Du eine präzise Fehlerbeschreibung von Direct3D in das VisualStudio-Ausgabefenster bekommen. Es gibt für andere IDEs auch Wege, an die Debug-Ausgaben ranzukommen, aber ich kenn mich damit nicht aus.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

7

25.11.2010, 11:54

Danke vielmals für diese tollen Antworten

Ich werde das sogleich ausprobieren.

Patrick Egli

Treue Seele

  • »Patrick Egli« ist der Autor dieses Themas

Beiträge: 161

Wohnort: Rainstrasse 38

  • Private Nachricht senden

8

25.11.2010, 12:34

So ich habe nun die PresentParameters etwas abgeändert. Zuerst habe ich nur die RefreshRate auf 0 gesetzt und habe die DLL getestet, doch es kam immer noch die gleiche Meldung. Nachher habe ich noch den StencilBuffer auf false gesetzt und das Format des StencilBuffers auf D3DFMT_UNKNOWN gesetzt, doch auch dann kam immer noch die Fehlermeldung.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
ZeroMemory(&PresentParams, sizeof(D3DPRESENT_PARAMETERS));

// Presentations-Parameter setzen
PresentParams.hDeviceWindow = m_hwnd;
PresentParams.BackBufferCount = 1;
PresentParams.BackBufferFormat = D3DFMT_X8R8G8B8;
PresentParams.BackBufferWidth = 800;
PresentParams.BackBufferHeight = 600;
PresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PresentParams.EnableAutoDepthStencil = false;
PresentParams.AutoDepthStencilFormat = D3DFMT_UNKNOWN;
PresentParams.Windowed = bWindowed;
PresentParams.MultiSampleQuality = NULL;
PresentParams.MultiSampleType = D3DMULTISAMPLE_NONE;
PresentParams.Flags = NULL;
PresentParams.FullScreen_RefreshRateInHz = 0;
PresentParams.PresentationInterval = NULL;


Beim Debuggen wird dann angezeigt, dass m_pD3DDevice den Wet 0x00000000 besitzt und das bedeutet ja, dass es keinen Inhalt auf dieser Variable hat. Warum?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

25.11.2010, 13:00

Na weil das Device nicht erstellt werden konnte weil die angegebenen PresentParameters nicht unterstützt werden. Probiers mal mit diesen Werten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
PresentParams.hDeviceWindow = m_hwnd;
PresentParams.BackBufferCount = 0;
PresentParams.BackBufferFormat = D3DFMT_UNKNOWN;
PresentParams.BackBufferWidth = 0;
PresentParams.BackBufferHeight = 0;
PresentParams.SwapEffect = D3DSWAPEFFECT_DISCARD;
PresentParams.EnableAutoDepthStencil = TRUE;
PresentParams.AutoDepthStencilFormat = D3DFMT_D16;
PresentParams.Windowed = TRUE;
PresentParams.MultiSampleQuality = 0;
PresentParams.MultiSampleType = D3DMULTISAMPLE_NONE;
PresentParams.Flags = 0;
PresentParams.FullScreen_RefreshRateInHz = 0;
PresentParams.PresentationInterval = 0;

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

10

25.11.2010, 14:37

Was sagt denn nun die DirectX Debug Runtime? Die erklärt Dir wirklich, warum konkret das Device nicht erstellt werden konnte.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

Werbeanzeige