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

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

1

10.08.2008, 21:28

opengl texturen im fullscreen und colorkey

hi ich bins wieder mal mit meine opengl problemen ^^
also ich hab ein 2 problem und eine frage:

1.wenn ich die größe des fensters verändere verschwindet das bild(textur)

Quellcode

1
2
3
4
5
6
7
8
9
LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
//.....
case WM_SIZE: 
    {
      ReSizeGLScene(LOWORD(lParam),HIWORD(lParam)); 
      return 0;
    }
//...
}

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
GLvoid ReSizeGLScene(GLsizei width, GLsizei height){
    if(height == 0)
        height = 1;

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
    glMatrixMode(GL_MODELVIEW);
}


2.und wenn ich in den fenstermodus starte und dann in den fullscreen wechsle(oder umgekert fullscreen->fenster), wird die textur weiß eben weiß gefüllt

CreateGLWindow(LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM),char* title, int width, int height, int bits, bool fullscreenflag);

Quellcode

1
2
3
4
KillGLWindow();
fullscreen =! fullscreen; 
if(!CreateGLWindow(WndProc,APP_TITLE,WND_WIDTH,WND_HEIGHT,WND_BITS,fullscreen))    
    return 0;


und wennst vll noch hilfst die init funktion

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int InitGL(GLsizei width, GLsizei height){
        //init  openil
    ilInit();
    iluInit();
    ilutRenderer(ILUT_OPENGL);

    glShadeModel(GL_SMOOTH);
    glEnable(GL_TEXTURE_2D);

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);   
    glClearDepth(1.0);                      
    glDepthFunc(GL_LESS);               
    glEnable(GL_DEPTH_TEST);                

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();                       
    gluOrtho2D(0,width,height,0);

    glMatrixMode(GL_MODELVIEW);

    return TRUE; 
}


meine createwindow funktion ist eigentlich die von NeHe
http://www.codeworx.org/opengl_tut2.php

und zu letzt, meine frage:
wie bestimme ich den colorkey einer textur

kiba

Alter Hase

  • »kiba« ist der Autor dieses Themas

Beiträge: 327

Wohnort: NRW

Beruf: Azubi: Fach-Info. Anw.

  • Private Nachricht senden

2

14.08.2008, 18:23

sry für den doppelpost, wollt nur sagen das ich das so halb geschaft ,
hab das 1. prob gelöst

ich hab die resize und das init geändert

Quellcode

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
GLvoid ReSizeGLScene(GLsizei width, GLsizei height,GLsizei screen_width,GLsizei screen_height){
    if(height == 0)
        height = 1;

    glViewport(0, 0, width, height);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluOrtho2D(0,screen_width,screen_height,0);

    glMatrixMode(GL_MODELVIEW);
    
}

int Init2DGL(){
    ilInit();
    iluInit();
    ilutRenderer(ILUT_OPENGL);

    glShadeModel(GL_SMOOTH);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glDisable(GL_DEPTH_TEST);   

    return TRUE; 
}

aber ich muss immer die texture in der main-schleife neu laden
damit der die textue auch im fullscreen anzeigt
(sonst zeigt er nur ein weißes rechteck an)

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
             while(!done){
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
            if (msg.message == WM_QUIT)
                done = true;
            else{
                TranslateMessage(&msg);
                DispatchMessage(&msg); 
            }
        }else{
            if (active){
                if (keys[VK_ESCAPE])
                    done = TRUE;
                else{
                    ClearGLScene();
                    if (!(texture = LoadTexture("note.png")))
                        return 0;
                    Render2DTexture(texture,X,Y,213,250);
                    SwapBuffers(hDC); 
                }
            }
        }

was muss ich jetzt machen damit der nicht die ganze zeit die textur neu laden muss

p0llux

Treue Seele

Beiträge: 101

Wohnort: Aachen

Beruf: HiWi (theo. Inf.)

  • Private Nachricht senden

3

15.08.2008, 00:04

Hm. Also bei Direct3D komme ich nicht herum die Texturen neu zu laden, wenn ich in den Fullscreenmodus (oder daraus zurück) wechsel. Ich erinnere mich grau irgendwas von "Context loss" oder so zu dem Thema gelesen zu haben.

In den gaaanz alten Zeiten, in denen ich OpenGL benutzt hab, ist mir das nicht passiert, allerdings heisst das nicht, dass es das da nicht gibt. Du kannst natürlich nach dem Wechsel die Texturen neu laden, aber vielleicht findest du ja eine Funktion, die dir anzeigt, wann das wirklich nötig ist (Ich hab' auf die Schnelle im Bluebook leider nix gefunden).

Bei Direct3D gibt es allerdings eine Method um herauszufinden, ob es nötig ist die Texturen erneut zu laden. Vielleicht hast du ja mehr Glück als ich ;)

Anonymous

unregistriert

4

15.08.2008, 09:19

Das ist korrekt, es gibt wirklich eine Art "Context Lost" und das Fenster samt neuen DC und RC müssen neu generiert und gesetzt werden, dadurch müssen ebenfalls auch alle Texturen neu geladen werden, da der alte RC nicht mehr existiert. Aber bitte vorher die Texturen freigeben ;)

Interessanterweise ist das jedoch Treiberspezifisch. Unter nVidia-Karten hatte ich so einen Fall äußerst selten, während ich unter ATI-Karten dies non-Stop hatte. Bei Intel-Karten scheint es auch keine Probleme zu geben.

p.s.: Diesen "Context Lost" gibt es jedoch nur unter Windows-Systemen. Auf Linux-Systemen oder so gibt es so ein Problem nicht, da hier das Betriebssystem alles verwaltet.

Powerpaule

Treue Seele

Beiträge: 162

Wohnort: Berlin

Beruf: Softwareentwickler

  • Private Nachricht senden

5

15.08.2008, 09:28

Es gibt keinen Colorkey wie in SDL oder DDraw oder aehnliches. Solche Sachen bestimmst du ueber den Transparentwert eines Pixels.
Du koenntest beim Laden der Textur beispielsweise jeden Pixel, der die Farbe hat, die transparent sein soll, auf volle Transparenz setzen.

Werbeanzeige