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

13.08.2006, 19:16

Textur als Hintergrund

hi,

ich habe mich mal wieder an OpenGL rangewagt und versucht ein Fenster zu erstellen in dem eine Textur angezeigt wird (über die gesamte Größe)

also hab ich mir eine BMP erstellt und versucht sie zu laden. wer hätte das gedacht, der bildschirm bleibt schwarz...

und jetzt wollte ich mal wissen, wie ich den fehler jetzt am besten finde, weil es lässt sich kompilieren und linken und jetzt jede einzelne funktion zu durchsuchen kann ja wohl nicht das einfachste sein.

kann man das nicht irgendwie durch tests einengen?

T-VIRUS

Alter Hase

Beiträge: 548

Wohnort: Göttingen(West)/Nordhausen(Ost)

Beruf: Schüler

  • Private Nachricht senden

2

13.08.2006, 19:22

Code posten dann kann man helfen ;)
Ich selbst würde das auch gerne wissen wie man das mit OGL macht da ich das für mein 2D Game brauche :)
Meine Blog:)

Wer Bugs im Text findet kann sie melden, fix erscheint irgendwann :D

MFG T-VIRUS

3

14.08.2006, 19:18

bitte schön...

mich würde aber trotzdem interessieren ob man den fehler nicht auch irgendwie anders finden kann. duch debugging zum beispiel...?

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
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
#include "main.h"


//**********************************************************************

// Lädt eine Bitmap                                                       *

//**********************************************************************


AUX_RGBImageRec *LoadBMP(const wchar_t *filename)
{
    FILE *file = NULL;                      // File-Handle


    if(!filename)
        return NULL;

    _wfopen_s(&file, filename, L"r");       // Existiert die Datei?


    if(file)                                // Falls ja...

    {
        fclose(file);                       // Handle schließen


        return auxDIBImageLoad(filename);   // Bitmap laden und Zeiger zurückgeben

    }

    return NULL;
}

//**********************************************************************

// Lädt eine Bitmap und konvertiert sie zu einer Textur                   *

//**********************************************************************


int LoadGLTextures()
{
    int status = false;

    AUX_RGBImageRec *TextureImage[1];                       // Platz für die Textur anfordern


    memset(TextureImage, 0, sizeof(void*));                 // Zeiger auf 0 setzen


    if(TextureImage[0] = LoadBMP(L"3D.bmp"))                // BMP laden

    {
        status = true;

        glGenTextures(1, &texture[0]);                      // Eine Textur erstellen


        // Erstellt eine Textur mit linearen Filtern

        glBindTexture(GL_TEXTURE_2D, texture[0]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY,
                     0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
    }

    // Falls eine Textur existiert, Speicher freigeben

    if(TextureImage[0])
    {
        if(TextureImage[0]->data)
            free(TextureImage[0]->data);

        free(TextureImage[0]);
    }

    return status;
}   

//**********************************************************************

// Initialisierung und Anpassen des Fensters                           *

//**********************************************************************


GLvoid ResizeGLScene(GLsizei width, GLsizei height)
{
    // Division durch 0 verhindern

    if(!height)
        height = 1;

    glViewport(0, 0, width, height);                            // Viewport resetten


    glMatrixMode(GL_PROJECTION);                                // Projektionsmatrix auswählen

    glLoadIdentity();                                           // und resetten


    gluPerspective(45.0f, GLfloat(width) / GLfloat(height),     // Bildseitenverhältnis berechnen

                   0.1f, 100.0f);

    glMatrixMode(GL_MODELVIEW);                                 // Modelview-Matrix auswählen

    glLoadIdentity();                                           // und resetten

}

//**********************************************************************

// Initialisierung von OpenGL                                          *

//**********************************************************************


int InitGL(GLvoid)
{
    // Texturen laden

    if(!LoadGLTextures())
        return false;

    glEnable(GL_TEXTURE_2D);                            // Texture-Mapping aktivieren

    glShadeModel(GL_SMOOTH);                            // Smooth Shading aktivieren

    glClearColor(0.0f, 0.0f, 0.0f, 0.5f);               // Schwarzer Hintergrund

    glClearDepth(1.0f);                                 // Depth Buffer mir schwarz füllen

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  // Genaue Perspektiven Berechnungen

    glBlendFunc(GL_SRC_ALPHA, GL_ONE);                  // Blend-Funkion für Transparenz

    glEnable(GL_BLEND);

    return true;
}

//**********************************************************************

// Zeichenfunktion                                                     *

//**********************************************************************


int DrawGLScene(void)
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);             // Bildschirm und Tiefenbuffer resetten

    glBindTexture(GL_TEXTURE_2D, texture[0]);                       // Textur auswählen


    glLoadIdentity();

    glBegin(GL_QUADS);
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 0.0f);
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 0.0f);
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, 0.0f);
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, 0.0f);
    glEnd();

    return TRUE;
}

//**********************************************************************

// Fenster löschen                                                    *

//**********************************************************************


GLvoid KillGLWindow(GLvoid)
{
    if(fullscreen)
    {
        ChangeDisplaySettings(NULL, 0);
        ShowCursor(TRUE);
    }

    if(hRC)
    {
        if(!wglMakeCurrent(NULL, NULL))
        {
            MessageBox(NULL, L"Freigabe des DC und RC fehlgeschlagen!", L"SHUTDOWN ERROR",
                       MB_OK | MB_ICONINFORMATION);
        }

        if(!wglDeleteContext(hRC))
        {
            MessageBox(NULL, L"Freigabe des RC fehlgeschlagen!", L"SHUTDOWN ERROR",
                       MB_OK | MB_ICONINFORMATION);
        }

        hRC = NULL;
    }

    if(hDC && !ReleaseDC(hWnd, hDC))
    {
        MessageBox(NULL, L"Freigabe des DC fehlgeschlagen!", L"SHUTDOWN ERROR",
                   MB_OK | MB_ICONINFORMATION);
        hDC = NULL;
    }

    if(hWnd && !DestroyWindow(hWnd))
    {
        MessageBox(NULL, L"Freigabe des hWnd fehlgeschlagen!", L"SHUTDOWN ERROR",
                   MB_OK | MB_ICONINFORMATION);
        hWnd = NULL;
    }

    if(!UnregisterClass(L"OpenGL", hInstance))
    {
        MessageBox(NULL, L"Klasse abmelden fehlgeschlagen!", L"SHUTDOWN ERROR",
                   MB_OK | MB_ICONINFORMATION);
        hInstance = NULL;
    }
}

//**********************************************************************

// Erstellt das OpenGL Fenster                                         *

//**********************************************************************


bool CreateGLWindow(wchar_t* title, int width, int height, int bits, bool fullflag)
{
    GLuint      PixelFormat;        // Beinhaltet später das passende Pixelformat

    WNDCLASS    wc;                 // Window-Class-Struktur

    DWORD       dwExStyle;
    DWORD       dwStyle;
    RECT        WindowRect;         // Obere linke + untere rechte Ecke


    // Fenstermaße setzen

    WindowRect.left = long(0);
    WindowRect.right = long(width);
    WindowRect.top = long(0);
    WindowRect.bottom = long(height);

    fullscreen = fullflag;          // Globales Fullscreen-Flag setzen


    hInstance           = GetModuleHandle(NULL);                    // Instanz für das Fenster erstellen

    wc.style            = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;       // Neu zeichnen beim Größe verstellen + eigener DC

    wc.lpfnWndProc      = WNDPROC(WndProc);                         // Zeiger auf die Fenster-Prozedur

    wc.cbClsExtra       = 0;                                        // Keine Extrabytes nach Struktur

    wc.cbWndExtra       = 0;                                        // oder Instanz

    wc.hInstance        = hInstance;                                // Instanz setzen

    wc.hIcon            = LoadIcon(NULL, IDI_WINLOGO);              // Default icon...

    wc.hCursor          = LoadCursor(NULL, IDC_ARROW);              // ...und Cursor laden

    wc.hbrBackground    = NULL;                                     // Kein Hintergrund

    wc.lpszMenuName     = NULL;                                     // Kein Menü

    wc.lpszClassName    = L"OpenGL";                                // Klassenname


    // Registriere Fensterklasse

    if(!RegisterClass(&wc))
    {
        MessageBox(NULL, L"Fehler beim Registrieren der Fensterklasse!", L"ERROR",
                   MB_OK | MB_ICONEXCLAMATION);

        return false;
    }

    // Setze Fullscreen-Modus

    if(fullscreen)
    {
        DEVMODE dmScreenSettings;                                                   // Device Mode

        memset(&dmScreenSettings, 0, sizeof(dmScreenSettings));                     // Speicher leeren

        dmScreenSettings.dmSize = sizeof(dmScreenSettings);                         // Größe der Struktur setzen

        dmScreenSettings.dmPelsWidth = width;                                       // Breite,

        dmScreenSettings.dmPelsHeight = height;                                     // Höhe und

        dmScreenSettings.dmBitsPerPel = bits;                                       // BBP in die Struktur eintragen

        dmScreenSettings.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;   // Flags setzen


        // Ausgewählten Modus setzen

        if(ChangeDisplaySettings(&dmScreenSettings, CDS_FULLSCREEN) != DISP_CHANGE_SUCCESSFUL)
        {
            // Falls nicht möglich, Fenstermodus vorschlagen, andernfalls verlassen

            if(MessageBox(NULL, L"Der gewählte Vollbildmodus wird\n von ihrer Grafikkarte nicht unterstützt.\n Soll stattdessen in den Fenstermodus gewechselt werden?",
                          L"Superman", MB_YESNO | MB_ICONEXCLAMATION) == IDYES)
            {
                fullscreen = false;
            }
            else
            {
                MessageBox(NULL, L"Programm wird geschlossen...", L"ERROR",
                           MB_OK | MB_ICONSTOP);

                return false;
            }
        }
    }

    // Fullscreen-Modus erfolgreich gesetzt?

    if(fullscreen)
    {
        dwExStyle = WS_EX_APPWINDOW;                        // Erstellt ein Top-Level Fenster in der Taskleiste

        dwStyle = WS_POPUP;                                 // Popup-Fenster erstellen

        ShowCursor(false);                                  // Cursor ausblenden

    }
    else
    {
        dwExStyle = WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;     // Top-Level-Fenster + Rahmen

        dwStyle = WS_OVERLAPPEDWINDOW;
    }

    AdjustWindowRectEx(&WindowRect, dwStyle, false, dwExStyle);     // Fenster auf die richtige Größe anpassen


    if(!(hWnd = CreateWindowEx(dwExStyle,                                       // Extended Window Style

                              L"OpenGL",                                        // Name der Klasse

                              title,                                            // Fenstertitel

                              dwStyle | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,      // Window Style

                              0, 0,                                             // Fensterposition

                              WindowRect.right - WindowRect.left,               // Breite

                              WindowRect.bottom - WindowRect.top,               // Höhe

                              NULL,                                             // Kein übergeordnetes Fenster

                              NULL,                                             // Kein Menü

                              hInstance,                                        // Instanz

                              NULL)))                                           // kein Pointer

    {
        KillGLWindow();
        MessageBox(NULL, L"Fehler beim Erstellen des Fensters!", L"ERROR",
                   MB_OK | MB_ICONEXCLAMATION);

        return false;
    }

    static PIXELFORMATDESCRIPTOR pfd=
    {
        sizeof(PIXELFORMATDESCRIPTOR),                                  // Größe des PFD

        1,                                                              // Versionsnummer

        PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |                       // Format muss Fenster, OpenGL und

        PFD_DOUBLEBUFFER,                                               // Double-Buffering unterstützen

        PFD_TYPE_RGBA,                                                  // RGBA-Format anfordern

        bits,                                                           // Farbtiefe

        0, 0, 0, 0, 0, 0,                                               // Ignorierte Farbbits

        0,                                                              // ...

        0,
        0,
        0, 0, 0, 0,
        16,                                                             // 16 Bit Z-Buffer

        0,                                                              // Kein Stencil-Buffer

        0,                                                              // Kein Auxilary-Buffer

        PFD_MAIN_PLANE,                                                 // Ebene auf der gezeichnet wird

        0,
        0, 0, 0                                                         // Ignorierte Ebenen-Masken

    };

    // DC erstellen

    if(!(hDC = GetDC(hWnd)))
    {
        KillGLWindow();
        MessageBox(NULL, L"Fehler beim Erstellen des GL Device Context!", L"ERROR",
                   MB_OK | MB_ICONEXCLAMATION);

        return false;
    }

    // Konnte Windows ein passendes Pixel-Format finden?

    if(!(PixelFormat = ChoosePixelFormat(hDC, &pfd)))
    {
        KillGLWindow();
        MessageBox(NULL, L"Kein passendes Pixelformat gefunden!", L"ERROR",
                   MB_OK | MB_ICONEXCLAMATION);
        
        return false;
    }

    // Pixel-Format setzen

    if(!SetPixelFormat(hDC, PixelFormat, &pfd))
    {
        KillGLWindow();
        MessageBox(NULL, L"Pixelformat konnte nicht gesetzt werden!", L"ERROR",
                   MB_OK | MB_ICONEXCLAMATION);

        return false;
    }
    
    // RC erstellen

    if(!(hRC = wglCreateContext(hDC)))
    {
        KillGLWindow();
        MessageBox(NULL, L"Fehler beim Erstellen des GL Rendering Context!", L"ERROR",
                   MB_OK | MB_ICONEXCLAMATION);

        return false;
    }

    // RC aktivieren

    if(!wglMakeCurrent(hDC, hRC))
    {
        KillGLWindow();
        MessageBox(NULL, L"Aktivierung des GL Rendering Context fehlgeschlagen!", L"ERROR",
                   MB_OK | MB_ICONEXCLAMATION);

        return false;
    }

    ShowWindow(hWnd, SW_SHOW);              // Fenster anzeigen

    SetForegroundWindow(hWnd);              // Priorität leicht erhöhen

    SetFocus(hWnd);                         // Fokus für Tastatureingaben setzen

    ResizeGLScene(width, height);           // Das GL-Fenster initialisieren und anpassen


    // Das neu erstellte Fenster initialisieren

    if(!InitGL())
    {
        KillGLWindow();
        MessageBox(NULL, L"Initialisierung fehlgeschlagen!", L"ERROR",
                   MB_OK | MB_ICONEXCLAMATION);

        return false;
    }

    return true;
}

//**********************************************************************

// Behandelt Fenster-Nachrichten                                       *

//**********************************************************************


LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)                             // Testen, ob Message vorhanden

    {
        case WM_ACTIVATE:                   // Falls Window-Activate-Message...

        {
            if(!HIWORD(wParam))             // Minimier-Status checken

            {
                active = true;
            }
            else
            {
                active = false;
            }

            return 0;
        }

        case WM_SYSCOMMAND:                 // System-Befehle abfangen

        {
            switch(wParam)                  // System-Aufrufe checken

            {
                case SC_SCREENSAVE:         // Bildschirmschoner aktiv?

                case SC_MONITORPOWER:       // Power-safe-Modus aktiv?


                    return 0;               // Falls ja, verhindern

            }

            break;
        }

        case WM_CLOSE:                      // Gab es eine Close-Message

        {
            PostQuitMessage(0);             // Quit-Message verschicken


            return 0;
        }

        case WM_KEYDOWN:                    // Wurde eine Taste gedrückt?

        {
            keys[wParam] = true;            // mit 'true' markieren


            return 0;
        }

        case WM_KEYUP:                      // Wurde eine Taste losgelassen

        {
            keys[wParam] = false;           // wieder auf 'false' setzen


            return 0;
        }

        case WM_SIZE:                                           // OpenGL-Fenster wurde verändert

        {
            ResizeGLScene(LOWORD(lParam), HIWORD(lParam));      // An Funktion verweisen


            return 0;
        }
    }

    return DefWindowProc(hWnd, msg, wParam, lParam);            // Alle unbehandelten Messages an DefWindowProc schicken

}

//**********************************************************************

// Main-Funktion                                                       *

//**********************************************************************


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MSG msg;
    bool done = false;

    // User nach Vollbild fragen

    if(MessageBox(NULL, L"Soll das Programm im Vollbild-Modus gestartet werden?", L"Vollbild?",
                   MB_YESNO | MB_ICONQUESTION) == IDNO)
    {
        fullscreen = false;
    }

    // OpenGL-Fenster erstellen

    if(!CreateGLWindow(L"Superman", 640, 480, 16, fullscreen))
    {
        return 0;
    }

    // Nachrichtenschleife

    while(!done)
    {
        // Liegt eine Message vor?

        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            // Ist es eine Quit-Message?

            if(msg.message == WM_QUIT)
            {
                // Schleife beenden

                done = true;
            }
            else
            {
                // Message übersetzen und verarbeiten

                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
        }
        else
        {
            // Szene zeichnen, auf ESC-key achten

            if((active && !DrawGLScene()) || keys[VK_ESCAPE])
            {
                done = true;
            }
            else
            {
                // Buffer zeichnen

                SwapBuffers(hDC);

                // Wurde F1 gedrückt?

                if(keys[VK_F1])
                {
                    keys[VK_F1] = false;
                    KillGLWindow();                                             // Fenster schließen

                    fullscreen = !fullscreen;                                   // fullscreen flag umkehren

    
                    if(!CreateGLWindow(L"Superman", 640, 480, 16, fullscreen))  // Neues Fenster erstellen

                    {
                        return 0;
                    }
                }
            }
        }
    }

    KillGLWindow();
    
    return(msg.wParam);
}

matthias

Alter Hase

Beiträge: 449

Wohnort: wipperfürth

  • Private Nachricht senden

4

14.08.2006, 19:59

muss man bei gl keine lichteinstellungen machen?
"In those days spirits were brave, the stakes were high, men were REAL men, women were REAL women, and small furry creatures from Alpha Centauri were REAL small furry creatures from Aplha Centauri."

5

14.08.2006, 20:12

also ich habs nur mal kurz überflogen, aber eins is miraufgefallen:
versuch mal nach glLoadIdentity:
glTranslated(0,0,-5.0);

desweiteren sieht mir dein pixelformat n bissl spanisch aus...
irgendwie ganz schön viele nullen :)
EDIT: ah, bits stehen doch dabei, überlesen...

mach zur sicherheit noch glDisable(GL_LIGHING); aber dürfte eigentlichs chon der standartwert sein
das dürfte auch die frage von matthias beantworten :)

6

14.08.2006, 23:06

Zitat von »"WarMuuh!!"«

also ich habs nur mal kurz überflogen, aber eins is miraufgefallen:
versuch mal nach glLoadIdentity:
glTranslated(0,0,-5.0);


aaaah es tut so weh...

das is genau das was ich meine...wie soll ich so einen scheißfehler in 500 zeilen code finden :(

/edit: noch ne andere frage: wie krieg ich es denn jetzt hin dass die textur immer über das ganze fenster geht (auch wenn es skaliert wird)?

Werbeanzeige