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

1

26.03.2010, 11:30

2D und OpenGL

Also ich habe bisher noch nie etwas mit OpenGL gemacht, aber möchte jemanden einen Gefallen tun und ihm ein kleines 2D Programm schreiben. Allerdings komme ich mit dem Koordinaten System nicht wirklich zurecht. Da ich auch nicht viel Zeit für das Programm habe (Sonntag) und googeln bis jetzt noch nichts gebracht hat, wollte ich mal hier fragen, wie ich die Screen Koordinaten wie bei der z.B. der GDI umrechnen kann. Als Beispiel möchte ich ein Rechteck zeichnen. Das klappt auch, allerdings ist es ziemlich lästig das Rechteck mit den Koordinaten -1 und +1 richtig zu positionieren. Meine bisherige Lösung gefällt mir auch nicht so richtig, sollte es nicht anders gehen, wäre es aber noch akzeptabel.

Ich habe auch noch 2 Dialoge, die mehrere Buttons besitzen, welche ich als Menü verwende. Ich habe mehrere hdc's und hglrc's erstellt und versuche beim rendern zum Beispiel auf eines der Dialoge mit wglMakeCurrent zu rendern, was nicht funktioniert. Wenn die beiden Probleme gut gelöst sind, krieg ich den Rest auch ohne Probs alleine hin, schonmal danke für die Hilfe.

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
bool chooseFormat(HWND handle, HDC& hdc, HGLRC& hrc)
{
    PIXELFORMATDESCRIPTOR pfd;
    ZeroMemory(&pfd, sizeof(PIXELFORMATDESCRIPTOR));

    pfd.nSize      = sizeof(PIXELFORMATDESCRIPTOR);
    pfd.nVersion   = 1;
    pfd.dwFlags    = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
    pfd.iPixelType = PFD_TYPE_RGBA;
    pfd.cColorBits = 16;
    pfd.cDepthBits = 16;

    hdc = GetDC(handle);
    GLuint pixelFormat = ChoosePixelFormat(hdc, &pfd);

    if(pixelFormat != 0)
    {
        PIXELFORMATDESCRIPTOR bestMatch;
        DescribePixelFormat(hdc, pixelFormat, sizeof(pfd), &bestMatch);

        // Hier sind ein paar Fehlerabfragen


    }

    hrc = wglCreateContext(hdc);

    return true;
}


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    wglMakeCurrent(hdcmenu1, hrcmenu1);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 0.0f);

    // Auflösung: 800x600

    glVertex2d(-400.0f/400.0f,250.0f/300.0f);
    glVertex2d(-400.0f/400.0f,300.0f/300.0f);
    glVertex2d(-350.0f/400.0f,300.0f/300.0f);
    glVertex2d(-350.0f/400.0f,250.0f/300.0f);
    glEnd(); 

    SwapBuffers(hdcmenu1);

Tobiking

1x Rätselkönig

  • Private Nachricht senden

2

26.03.2010, 12:13

Du kannst einfach eine passende Projektion setzen. Die Funktion gluOrtho2D sollte für deinen Fall eine passende Projektion generieren, und das Koordinatensystem kannst du mit den übergebenen Werten selber bestimmen.

3

26.03.2010, 12:50

Perfekt! Habs jetzt endlich hinbekommen, thx! Nur auf den Dialogen zu zeichnen funktioniert noch nicht. Ich werds weiterhin probieren, aber wenn jemand weiß wie es geht, wäre ich ebenfalls sehr dankbar. ;)

4

26.03.2010, 14:16

Okay habe es jetzt hinbekommen. Man muss jedes Mal das DC löschen und neu initialisieren, wenn man das DC wechseln will. Und die Projektion muss natürlich für das Menü neu gesetzt werden.

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
void render(void)
{
    chooseFormat(window, hdcwindow, hrcwindow);
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 800, 600, 0);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    
    glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 0.0f);

    glVertex2d(50, 50);
    glVertex2d(100, 50);
    glVertex2d(100, 100);
    glVertex2d(50, 100);
    glEnd();

    SwapBuffers(hdcwindow);

    destroy();

    chooseFormat(menu1, hdcmenu1, hrcmenu1);
    glClearColor(0.0f, 1.0f, 0.0f, 1.0f);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0, 792, 75, 0);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    
    glBegin(GL_QUADS);
    glColor3f(1.0f, 0.0f, 0.0f);

    glVertex2d(0, 0);
    glVertex2d(50, 0);
    glVertex2d(50, 50);
    glVertex2d(0, 50);
    glEnd();

    SwapBuffers(hdcmenu1);

    destroy();
}

Alyx

Treue Seele

Beiträge: 236

Wohnort: Hannover

Beruf: Head Of Software Development

  • Private Nachricht senden

5

26.03.2010, 15:24

Man muss da ganz bestimmt nichts löschen :-).

Ist schon eine Weile her, aber ich hatte auch schon Programme mit 7 Fenstern, die alle ihren eigenen Context hatten, und da muss 100% nichts gelöscht und neu erstellt werden. Also entweder ist es ein Treiberbug... wovon ich nun mal nicht ausgehe... oder da ist woanders der Wurm drin ;-).

Da in OpenGL die Handles immer threadgebunden sind, wäre ein Ansatz das Initialisieren und Zeichnen einfach in einem anderen Thread zu triggern.

LG
Alyx

6

26.03.2010, 19:17

Mh naja, wenn das Programm fertig ist, werd ich mir das nochmal genauer anschauen. Aber das wichtigste ist erstmal, dass es bis Sonntag fertig wird. ^^

Werbeanzeige