[C++/OpenGL] OpenGL code 'doet niets' + Win32 probleem

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Mnstrspeed
  • Registratie: Oktober 2007
  • Laatst online: 11-10 11:15
Ik ben voor een project aan het prutsen met OpenGL 3.1, maar ik loop al meteen bij het initialiseren van OpenGL (of Win32) vast :( Het doel van de onderstaande code is vrij standaard: een window aanmaken en er een driehoek in tekenen.


C++:
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
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>

LRESULT CALLBACK WndProc(HWND hWnd, UINT message,
                         WPARAM wParam, LPARAM lParam)
{
    static HGLRC hRC;
    static HDC hDC;
    static int pixelFormat;
    
    switch(message)
    {
    case WM_CREATE:
        hDC = ::GetDC(hWnd);

        PIXELFORMATDESCRIPTOR pfd;
        ::ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));
        pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_SUPPORT_OPENGL | PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 24;
        pfd.cDepthBits = 32;
        pfd.iLayerType = PFD_MAIN_PLANE;

        pixelFormat = ::ChoosePixelFormat(hDC, &pfd);
        ::SetPixelFormat(hDC, pixelFormat, &pfd);

        hRC = ::wglCreateContext(hDC);
        ::wglMakeCurrent(hDC, hRC);

        ::glEnable(GL_DEPTH_TEST);
        ::glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

        break;

    case WM_PAINT:
        ::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        ::glLoadIdentity();
        ::glBegin(GL_TRIANGLES);
        
        ::glColor3f(0.0f, 0.0f, 0.0f);
        ::glVertex3f(0.0f, 0.0f, 0.0f);
        ::glVertex3f(1.0f, 0.0f, 0.0f);
        ::glVertex3f(0.0f, 1.0f, 0.0f);
        
        ::glEnd();
        
        break;

    case WM_CLOSE:
    case WM_DESTROY:
        ::wglMakeCurrent(NULL, NULL);
        ::wglDeleteContext(hRC);

        ::PostQuitMessage(0);
        break;
    }

    return ::DefWindowProc(hWnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
               LPSTR lpCmdLine, int nShowCmd)
{
    HWND hWnd;
    WNDCLASSEX wc;

    ::ZeroMemory(&wc, sizeof(WNDCLASSEX));

    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = (WNDPROC)WndProc;
    wc.hInstance = hInstance;
    wc.hCursor = ::LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
    wc.lpszClassName = "GLClass";

    ::RegisterClassEx(&wc);

    hWnd = ::CreateWindowEx(NULL, "GLClass", "OpenGL Test",
        WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL,
        hInstance, NULL);

    ::ShowWindow(hWnd, nShowCmd);
    ::UpdateWindow(hWnd);

    MSG msg;

    ::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);

    while (msg.message != WM_QUIT)
    {
        if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            ::TranslateMessage(&msg);
            ::DispatchMessage(&msg);
        }

        // game loop
    }

    return 0;
}


Vergeef me voor het ontbreken van comments.. De code was als test bedoeld

Bij het compilen en runnen in Visual Studio 2008 Professional (waarbij overigens geen errors optreden) verschijnt er wel een window op het scherm met de juiste eigenschappen, maar de OpenGL code lijkt niets te doen. Ik ben minstens 10 keer iedere regel code nagegaan tijdens het debuggen en alles lijkt te functioneren..

Ik ben hier inmiddels al twee dagen mee bezig en heb zo onderhand 5 pagina's Google pagina's aan OpenGL tutorials doorgelezen, maar nog steeds kan ik geen fout ontdekken.. Verder lijkt mijn Win32 code ook niet helemaal te kloppen, aangezien er bij het runnen van de code af en toe strepen in andere windows komen.. Voorbeeld hiervan: http://i29.tinypic.com/s2xfs5.jpg.

Ik hoop dat jullie me kunnen helpen, want ik (als C++ beginner) ben echt ten einde raad :/

Ehhh wat?


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 00:16

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom roep je nergens SwapBuffers() aan, waarmee je de contents van je backbuffer toont op je hDC? :)

Daarnaast zou ik het tekenen niet in de WM_PAINT doen (die wordt alleen aangeroepen als je window opnieuw getekend moet worden, bijvoorbeeld omdat er een andere window voorlangs is gegaan), en ik zou in je messageloop berichten blijven afhandelen tot er geen meer zijn, en daarna je gameloop pas doen (ipv zoals jij nu hebt max 1 message per gameloop iteratie).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

Heeft Windows (vista zo te zien hoewel je dat niet vermeld) al OpenGL 3.1 support dan?

En je videokaart drivers ook? Verder weet ik niet of je videokaart ook hardware support nodig heeft zoals met DirectX 10 bijvoorbeeld. Als je strepen ziet in andere programma's dan lijkt het alsof je programma iets van je videokaart vraagt wat niet helemaal goed gaat en zelfs andere programma's beinvloed. Je code doet dus wel degelijk iets alleen niet wat je verwachte.

Check dus even of je OpenGL support/drivers/hardware etc wel helemaal goed zijn.

Post ook even je exacte pc specs, OS versie, driver versie, etc aangezien dat wel relevant voor dit topic kan zijn.

Acties:
  • 0 Henk 'm!

  • Mnstrspeed
  • Registratie: Oktober 2007
  • Laatst online: 11-10 11:15
He, verrek :D SwapBuffers aangeroepen voor glEnd en nu doet hij het inderdaad wel :)

Het tekenen in WM_PAINT is een tijdelijke oplossing totdat ik heb besloten hoe ik de het aantal frames per seconde ga beperken (150 000 keer per seconde lijkt mij iig overdreven voor een stilstaande driehoek :P) Bij het afhandelen van de messageloop heb je inderdaad ook wel een punt, even aanpassen dus :)

Nog ideeen voor probleem #2?

edit:

@ hierboven:
Ik heb er een GTX260 55nm (GeForce 185.81 driver) inhangen en volgens de NVIDIA site wordt OpenGL 3.1 gewoon ondersteund. Verder draai ik de de Window 7 RC. Dat het een beta/RC OS is kan inderdaad wel een oorzaak zijn, maar aangezien ik er bij andere applicaties geen last van heb, zit het me toch niet helemaal lekker (@ Win32 probleem)

[ Voor 28% gewijzigd door Mnstrspeed op 15-07-2009 18:14 ]

Ehhh wat?


Acties:
  • 0 Henk 'm!

  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

OpenGL 3.1 ondersteunt strict gezien niet eens glBegin/End :) (dus hij draait sowieso al in 2.1 compatibility mode) (huidige nvidia driver + >=G80 bord is genoeg voor 3.1)

Zie ook http://www.wikiscripts.net/#action=post&id=149 voor een echte 3.1 context.

[ Voor 69% gewijzigd door Zoijar op 15-07-2009 20:19 ]


Acties:
  • 0 Henk 'm!

  • bobo1on1
  • Registratie: Juli 2001
  • Laatst online: 18-05 17:57
Swapbuffers kun je beter aanroepen buiten een glBegin-glEnd block.

Impedance, a measure of opposition to time-varying electric current in an electric circuit.
Not to be confused with impotence.

Pagina: 1