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

DasBlub

Alter Hase

  • »DasBlub« ist der Autor dieses Themas

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

1

27.04.2008, 19:09

problem beim rendern eines dreiecks

hallo zusammen

ich bin gerade dabei, meine eigene kleine gameengine zu schreiben (~3 DLLs momentan). ich bin nun soweit, ein dreieck zu zeichnen (direkt aus der render engine ^^). dabei passiert jedoch folgendes:

(Link)

dies ist bei fullscreen das gleiche.

hier meine einstellungen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[ConfigDialog]
allwaysShowConfig=0

[RenderEngines]
RE0="DirectXRE"
RE1="openGLRE"

countRenderEngines=2
defaultRenderEngine=0

#windowed=0
#screenWidth=1680
#screenHeight=1050
windowed=1
screenWidth=800
screenHeight=600
refreshRate=60


hier der code zum initialisieren von dx + erstellen des dreiecks:

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
mgeResult DirectXRE::Init(MyGameEngine* mge, HWND hOwnWnd) {
    MGE_INFO("%s", "Initializing RenderEngine...");
    if(mge==NULL) // mge can't be NULL!

        return MGE_ERROR;
    
    this->m_mge = mge;

    if(hOwnWnd != NULL) { // user has a own window, take it!

        this->m_hWnd = hOwnWnd;
        this->m_bOwnWnd = true;
    } else { // create a new window

        MGE_INFO("%s", "No own window, creating one...");
        ///////////////////////////////////

        // start a window

        this->m_bOwnWnd = false;

        ZeroMemory(&this->m_wc, sizeof(WNDCLASSEX)); // clear the memory


        // fill the struct with the infos

        this->m_wc.cbSize           = sizeof(WNDCLASSEX);
        this->m_wc.style            = CS_HREDRAW | CS_VREDRAW;
        this->m_wc.lpfnWndProc      = (WNDPROC)WindowProc;
        this->m_wc.hInstance        = DXRE_DLL_HANDLE;
        this->m_wc.hCursor          = LoadCursor(NULL, IDC_ARROW);
        this->m_wc.lpszClassName    = TEXT("mgeWndClass1");
        if(this->m_mge->getConfig()->RenderEngineConfig.bWindowed) this->m_wc.hbrBackground = (HBRUSH)COLOR_WINDOW;

        // register the windowclass

        RegisterClassEx(&this->m_wc);

        // create the window

        this->m_hWnd = CreateWindowEx(NULL
                                     ,TEXT("mgeWndClass1")
                                     ,TEXT("My Game Engine")
                                     ,this->m_mge->getConfig()->RenderEngineConfig.bWindowed ? WS_OVERLAPPEDWINDOW : WS_EX_TOPMOST | WS_POPUP // -> FULLSCREEN

                                     //,WS_OVERLAPPEDWINDOW      // -> NORMAL

                                     ,GetSystemMetrics(SM_CXSCREEN) / 2 - this->m_mge->getConfig()->RenderEngineConfig.iScreenWidth / 2
                                     ,GetSystemMetrics(SM_CYSCREEN) / 2 - this->m_mge->getConfig()->RenderEngineConfig.iScreenHeight / 2
                                     ,this->m_mge->getConfig()->RenderEngineConfig.iScreenWidth
                                     ,this->m_mge->getConfig()->RenderEngineConfig.iScreenHeight
                                     ,NULL
                                     ,NULL
                                     ,DXRE_DLL_HANDLE
                                     ,NULL);

        if(this->m_hWnd == NULL)
            MGE_ERROR("%s", "Couldn't create the Window!", MGE_ERROR);

        MGE_INFO("%s", "Window created!");
    }
    // display the window on the screen

    ShowWindow(this->m_hWnd, 1);

    ///////////////////////////////////

    // init DirectX

    MGE_INFO("%s", "Initializing DirectX...");

    this->m_d3d = Direct3DCreate9(D3D_SDK_VERSION); // create the direct3d interface

    
    ZeroMemory(&this->m_d3dPresentParams, sizeof(D3DPRESENT_PARAMETERS));
    this->m_d3dPresentParams.BackBufferWidth            = this->m_mge->getConfig()->RenderEngineConfig.iScreenWidth;
    this->m_d3dPresentParams.BackBufferHeight           = this->m_mge->getConfig()->RenderEngineConfig.iScreenHeight;
    this->m_d3dPresentParams.BackBufferFormat           = D3DFMT_A8R8G8B8; // nachher via config

    this->m_d3dPresentParams.BackBufferCount            = 1;
    //this->m_d3dPresentParams.MultiSampleType          = D3DMULTISAMPLE_NONE;

    this->m_d3dPresentParams.SwapEffect                 = D3DSWAPEFFECT_DISCARD;
    this->m_d3dPresentParams.hDeviceWindow              = this->m_hWnd;
    this->m_d3dPresentParams.Windowed                   = this->m_mge->getConfig()->RenderEngineConfig.bWindowed;
    //this->m_d3dPresentParams.EnableAutoDepthStencil       = FALSE;

    //this->m_d3dPresentParams.FullScreen_RefreshRateInHz   = this->m_mge->getConfig()->RenderEngineConfig.bWindowed ? D3DPRESENT_RATE_DEFAULT : this->m_mge->getConfig()->RenderEngineConfig.iRefreshRate;

    //this->m_d3dPresentParams.PresentationInterval     = D3DPRESENT_INTERVAL_IMMEDIATE;


    if(FAILED(this->m_d3d->CreateDevice(D3DADAPTER_DEFAULT
                                    ,D3DDEVTYPE_HAL
                                    ,this->m_hWnd
                                    ,D3DCREATE_SOFTWARE_VERTEXPROCESSING
                                    ,&this->m_d3dPresentParams
                                    ,&this->m_d3dDevice))) {
        MGE_ERROR("%s", "Couldn't create the d3d device!", MGE_ERROR);
    }

    this->m_d3dDevice->GetDeviceCaps(&this->m_d3dCaps);

    if(!this->m_mge->getConfig()->RenderEngineConfig.bWindowed) ShowCursor(FALSE);

    MGE_INFO("%s", "DirectX initialized");
    
    // dreieck laden

    ZeroMemory(&this->m_dreieck, sizeof(SVertex)*3);
    this->m_dreieck[0].x = 0.0f; this->m_dreieck[0].y = 1.0f; this->m_dreieck[0].z = 0.0f; this->m_dreieck[0].dwColor = D3DCOLOR_XRGB(255, 0, 0);
    this->m_dreieck[1].x = 1.0f; this->m_dreieck[1].y =-1.0f; this->m_dreieck[1].z = 0.0f; this->m_dreieck[0].dwColor = D3DCOLOR_XRGB(0, 255, 0);
    this->m_dreieck[2].x =-1.0f; this->m_dreieck[2].y =-1.0f; this->m_dreieck[2].z = 0.0f; this->m_dreieck[0].dwColor = D3DCOLOR_XRGB(0, 0, 255);
    this->m_d3dDevice->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
    this->m_d3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
    this->m_d3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    this->m_d3dDevice->SetRenderState(D3DRS_DITHERENABLE, TRUE);

    MGE_INFO("%s", "RenderEngine initialized!");
    return MGE_OK;
}


und hier der code zum rendern:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mgeResult DirectXRE::render(float fTime) {
    this->m_d3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(255, 0 , 0), 1.0f, 0);

    this->m_d3dDevice->BeginScene();

    this->m_d3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLELIST
                                      ,1
                                      ,this->m_dreieck
                                      ,sizeof(SVertex));

    this->m_d3dDevice->EndScene();
    this->m_d3dDevice->Present(NULL, NULL, NULL, NULL);
    return MGE_OK;
}


ich habe keine ahnung, weshalb das nicht richtig angezeigt wird, denn der hintergrund sollte rot sein, und das dreieck an jedem ecken in einer anderen farbe (rot, gruen, blue)

hier noch das logfile:

Zitat


MyGameEngine - Logfile
27.04.2008 16:56:15 INFO: Log started!
(mgeLogger::startLogger @ mgelogger.cpp 89)

27.04.2008 16:56:15 INFO: Debug Version!
(mgeLogger::startLogger @ mgelogger.cpp 91)

27.04.2008 16:56:15 INFO: Initializing mge...
(MyGameEngine::Init @ mygameengine.cpp 34)

27.04.2008 16:56:15 INFO: Loading config...
(mgeConfig::loadConfig @ mgeconfig.cpp 31)

27.04.2008 16:56:15 INFO: Allways show Config: False
(mgeConfig::loadConfig @ mgeconfig.cpp 37)

27.04.2008 16:56:15 INFO: countRenderStates: 2
(mgeConfig::loadConfig @ mgeconfig.cpp 44)

27.04.2008 16:56:15 INFO: RenderEngine: DirectXRE
(mgeConfig::loadConfig @ mgeconfig.cpp 54)

27.04.2008 16:56:15 INFO: RenderEngine: openGLRE
(mgeConfig::loadConfig @ mgeconfig.cpp 54)

27.04.2008 16:56:15 INFO: Default RenderEngine: DirectXRE
(mgeConfig::loadConfig @ mgeconfig.cpp 60)

27.04.2008 16:56:15 INFO: Windowed: True
(mgeConfig::loadConfig @ mgeconfig.cpp 67)

27.04.2008 16:56:15 INFO: Default screen width: 800
(mgeConfig::loadConfig @ mgeconfig.cpp 73)

27.04.2008 16:56:15 INFO: Default screen height: 600
(mgeConfig::loadConfig @ mgeconfig.cpp 74)

27.04.2008 16:56:15 INFO: Config loaded!
(mgeConfig::loadConfig @ mgeconfig.cpp 79)

27.04.2008 16:56:15 INFO: Initializing RenderEngine...
(DirectXRE::Init @ directxre.cpp 46)

27.04.2008 16:56:15 INFO: No own window, creating one...
(DirectXRE::Init @ directxre.cpp 56)

27.04.2008 16:56:16 INFO: Window created!
(DirectXRE::Init @ directxre.cpp 93)

27.04.2008 16:56:16 INFO: Initializing DirectX...
(DirectXRE::Init @ directxre.cpp 100)

27.04.2008 16:56:16 INFO: DirectX initialized
(DirectXRE::Init @ directxre.cpp 130)

27.04.2008 16:56:40 INFO: RenderEngine initialized!
(DirectXRE::Init @ directxre.cpp 142)

27.04.2008 16:56:44 INFO: mge initialized...
(MyGameEngine::Init @ mygameengine.cpp 66)

27.04.2008 16:56:47 INFO: Entering message loop...
(WinMain @ main.cpp 29)

27.04.2008 16:57:52 INFO: End of message loop!
(WinMain @ main.cpp 51)

27.04.2008 16:57:52 INFO: Log stopped!
(mgeLogger::stopLogger @ mgelogger.cpp 131)

2

27.04.2008, 19:37

Das Backbuffer-Format D3DFMT_A8R8G8B8 könnte ein Knackpunkt sein. Du leerst bei "Clear" auch den Z-Buffer, welcher kein Format hat.

DasBlub

Alter Hase

  • »DasBlub« ist der Autor dieses Themas

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

3

27.04.2008, 20:00

Zitat von »"TrikkieMikkie"«

Das Backbuffer-Format D3DFMT_A8R8G8B8 könnte ein Knackpunkt sein. Du leerst bei "Clear" auch den Z-Buffer, welcher kein Format hat.


danke, lag wirklich am z-buffer ;)
warum sollte das format nicht ok sein?

4

27.04.2008, 20:06

Ich würde einfach prüfen, welche Formate überhaupt unterstützt werden. So ist man auf der sicheren Seite.

DasBlub

Alter Hase

  • »DasBlub« ist der Autor dieses Themas

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

5

27.04.2008, 20:11

Zitat von »"TrikkieMikkie"«

Ich würde einfach prüfen, welche Formate überhaupt unterstützt werden. So ist man auf der sicheren Seite.


jaja, ist klar; ich wusste jedoch, dass dieses format von meiner graka (GeForce 8800GT ^^) unterstützt wird, und habe es deshalb von hand eingetragen, um schon mal ein resultat zu sehen ;)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

28.04.2008, 01:08

Zitat von »"TheWinner"«

jaja, ist klar; ich wusste jedoch, dass dieses format von meiner graka (GeForce 8800GT ^^) unterstützt wird, und habe es deshalb von hand eingetragen, um schon mal ein resultat zu sehen ;)


Benötigst du denn Fullscreen Destination Alpha!? Wenn nicht isses nämlich ziemlich sinnlos D3DFMT_A8R8G8B8 für den BackBuffer zu verwenden. Ich würd da lieber zu D3DFMT_X8R8G8B8 greifen...

Werbeanzeige