Problem mit TextureMapping + Lichteffekt in OpenGL (! Laden der Bitmap + Verwnden), Bitte um HILFE



  • Hi,
    sind die Normalenvektoren vielleicht falsch?



  • Hi!

    AUX_RGBImageRec *LoadBMP( char * filename ) {
    
        FILE *file;
        return LoadBMP( filename );
    }
    

    Sehr sinnig...

    Die .lib bindest du über die Projektoptionen oder über #pragma comment( lib, "glaux.lib" ) korrekt ein. Dann funktioniert das auch.

    Alternativ kannst du das Bitmap natürlich selbst laden, siehe hierzu die Windows Bitmap Format Spezifikation (google.de).

    Zum zweiten Problem:
    Ich nehm an das du die gesammte Scene rotierst was sich im Endeffekt so auswirkt als würde die Kammera sich bewegen. Also sind Licht und Würfel statisch und die angeleuchtete Würfelseite ebenfalls.

    grüße



  • hier mal der ganze code, doch ich dneke es liegt daran das die glaux.lib fehlt:

    //---------------------------------------------------------------------------
    
    #include <windows.h>
    #include <stdio.h>
    #include <gl\glaux.h>
    #include <gl\glu.h>
    #include <gl\gl.h>
    #include "texture.h"
    
    HDC hDC;
    HGLRC hRC;
    HWND hWnd;
    HINSTANCE hInstance;
    
    bool keys[256];
    bool done = false;
    
    GLfloat xrot = 0.0f;
    GLfloat yrot = 0.0f;
    GLfloat xmap, ymap;
    static GLfloat zoom = -40.0f;
    
    GLfloat LightAmbient[] = { 0.2f, 0.2f, 0.2f};
    GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f};
    GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f};
    
    GLuint texture;
    
    LRESULT CALLBACK WinProc( HWND, UINT, WPARAM, LPARAM );
    AUX_RGBImageRec *LoadBMP( char *filename );
    int LoadGLTextures();
    GLvoid ReSizeGLScene( GLsizei ,GLsizei );
    int InitGL();
    int DrawGLScene();
    GLvoid KillGLWindow();
    int CreateGLWindow( char *titel, int width, int height );
    
    int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow ) {
    
        MSG messages;
    
        CreateGLWindow( "OpenGL", 1024, 768 );
    
        while( !done ) {
    
            if( PeekMessage( &messages, 0, 0, 0, PM_REMOVE ) ) {
    
                if( keys[VK_ESCAPE] ) {
    
                    done = true;
                }
    
                else {
    
                    TranslateMessage( &messages );
                    DispatchMessage( &messages );
                }
            }
    
            else {
    
                    DrawGLScene();
                    SwapBuffers( hDC );
            }
        }
        KillGLWindow();
        return messages.wParam;
    }
    
    int LoadGLTextures() {
    
        bool Status = false;
    
        AUX_RGBImageRec *TextureImage ;
        memset( TextureImage, 0, sizeof( void* ) *1 );
    
        TextureImage = auxDIBImageLoad( ( "bitmap1.bmp" ) );
        Status = true;
    
        glGenTextures( 1, &texture );
        glBindTexture( GL_TEXTURE_2D, texture );
        glTexImage2D( GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE,
                      TextureImage -> data );
    
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
        glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
    
        if( TextureImage ) {
    
            if( TextureImage -> data ) {
    
                free( TextureImage -> data );
            }
    
            free( TextureImage );
        }
        return Status;
    }
    
    GLvoid ReSizeGLScene( GLsizei width, GLsizei height ) {  // init OpenGL Fenster
    
        if( height == 0 ) {
    
            height = 1;
        }
    
        glViewport( 0, 0, width, height );  // mittelpkt. der perspetive wird 0/0 gesetzt
        glMatrixMode( GL_PROJECTION );  //festlegung der projectionsmatrix
        glLoadIdentity();   //anpassung der projection
        gluPerspective( 45.0f, ( GLfloat ) width / (GLfloat ) height, 0.1f, 100.0f );
            //verhältnis von hoehe und breite + verzerungswinkel von 45,0°
        glMatrixMode( GL_MODELVIEW );   // festlegunf der model-view matrix
        glLoadIdentity();    // anpassung der modele
    
    }   // ende der init des OpenGL Fensters
    
    int InitGL() {  //init der OpenGL
    
     //  LoadGLTextures();
    
        glEnable( GL_TEXTURE_2D );
        glShadeModel( GL_SMOOTH );  // glSmooth sorgt fuer schoene farbübergänge auf körpern
        glClearColor( 0.0, 0.0, 0.5, 0.0 ); // fensterBG per RGB + alphafactor( transparenz )
        glClearDepth( 1.0 ); // bewirkt das räumliche ausehen von uebereinander liegenden Objecten
        glEnable( GL_DEPTH_TEST ); // aktiviert den depth test
        glDepthFunc( GL_LEQUAL );   // der typ des depthtest wird festgelegt
        glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );    //perspektive wird festgelegt
        glEnable( GL_LIGHTING );
        glLightfv( GL_LIGHT1, GL_AMBIENT, LightAmbient );
        glLightfv( GL_LIGHT1, GL_DIFFUSE, LightDiffuse );
        glLightfv( GL_LIGHT1, GL_POSITION, LightPosition );
    
        glEnable( GL_LIGHT1 );
        glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
        glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 100 );
    
        return true;
    }
    
    int DrawGLScene() { // hier passieren alle zeichen aktionen
    
        glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );   // löscht vorigen bildshcirm fuer
                                                                // naechste scene
        glLoadIdentity();   // matrix wird wieder zurückgesetzt
    
        glTranslatef( 0.0f, 0.0f, zoom );
        glRotatef( xrot , 1.0f, 0.0f, 0.0f );
        glRotatef( yrot , 0.0f, 1.0f, 0.0f );
        glRotatef( xmap , 1.0f, 0.0f, 0.0f );
        glRotatef( ymap , 0.0f, 1.0f, 0.0f );
    
      glBegin( GL_QUADS );
    
     //   glBindTexture( GL_TEXTURE_2D, texture );
        // Das vordere QUAD
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f);
        // unten links an der Form und der Textur
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); 
        // unten rechts an der Form und der Textur
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); 
        // oben rechts an der Form und der Textur
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); 
        // oben links an der Form und der Textur
    
        // Das hintere QUAD
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
        // unten rechts an der Form und der Textur
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f);
        // oben rechts an der Form und der Textur
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f);
        // oben links an der Form und der Textur
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        // unten links an der Form und der Textur
        // Das obere QUAD
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); 
        // oben links an der Form und der Textur
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); 
        // unten links an der Form und der Textur
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); 
        // unten rechts an der Form und der Textur
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); 
        // oben rechts an der Form und der Textur
        // Das untere QUAD
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); 
        // oben rechts an der Form und der Textur
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
        // oben links an der Form und der Textur
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); 
        // unten links an der Form und der Textur
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); 
        // unten rechts an der Form und der Textur
        // Das rechte QUAD
        glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); 
        // unten rechts an der Form und der Textur
        glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); 
        // oben rechts an der Form und der Textur
        glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); 
        // oben links an der Form und der Textur
        glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); 
        // unten links an der Form und der Textur
        // Das linke QUAD
        glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); 
        // unten links an der Form und der Textur
        glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); 
        // unten rechts an der Form und der Textur
        glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); 
        // oben rechts an der Form und der Textur
        glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); 
        // oben links an der Form und der Textur
      glEnd();
    
      glLoadIdentity();
    
      glTranslatef( 0.0f, 0.0f, zoom );
      glRotatef( xmap, 1.0f, 0.0f, 0.0f );
      glRotatef( ymap, 0.0f, 1.0f, 0.0f );
      glBegin( GL_QUADS );
        glVertex3f( -20.0f, -3.0f, -20.0f );
        glVertex3f(  20.0f, -3.0f, -20.0f );
        glVertex3f(  20.0f, -3.0f,  20.0f );
        glVertex3f( -20.0f, -3.0f,  20.0f );
      glEnd();
      glLoadIdentity();
    
        return true;
    }
    
    GLvoid KillGLWindow() {     // schliesst das GL Fenster
    
            ChangeDisplaySettings( 0, 0 );   // kehrt zum desktop zurück
            ShowCursor( true ); // abgeschalteter mauszeiger wird wieder sichtbar
    
            hDC = NULL;
            hRC = NULL;
            hInstance = NULL;
            hWnd = NULL;
    }
    
    int CreateGLWindow( char *titel, int width, int height ) {
    
        GLuint PixelFormat; // speichert pixelformat
        WNDCLASS wc;
        RECT wndRect;   // hier wird die auflösung gespeichert
    
            wndRect.left = ( long ) 0;
            wndRect.top = ( long ) 0;
            wndRect.right = ( long ) width;
            wndRect.bottom = ( long ) height;
    
        hInstance = GetModuleHandle( 0 );
    
        wc.lpfnWndProc = WinProc;
        wc.cbClsExtra = 0;
        wc.cbWndExtra = 0;
        wc.hInstance = hInstance;
        wc.lpszMenuName = 0;
        wc.lpszClassName = "OpenGL";
        wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
        wc.hCursor = LoadCursor( NULL, IDC_ARROW );
        wc.hbrBackground = NULL;
        wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
    
        RegisterClass( &wc );
    
            DEVMODE displaySettings;
            memset( &displaySettings, 0, sizeof( displaySettings ) );
            displaySettings.dmSize = sizeof( displaySettings );
            displaySettings.dmPelsWidth = width;
            displaySettings.dmPelsHeight = height;
            displaySettings.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT;
            ChangeDisplaySettings( &displaySettings, CDS_FULLSCREEN );
            ShowCursor( false );
    
          hWnd = CreateWindow( "OpenGL",
                               "Mein erstes OpenGL - Fenster",
                               WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_POPUP,
                               0, 0,
                               wndRect.right, wndRect.bottom,
                               NULL,
                               NULL,
                               hInstance,
                               NULL );
    
        static PIXELFORMATDESCRIPTOR pfd = {
    
            sizeof( PIXELFORMATDESCRIPTOR ),
            1,  //versionnummer
            PFD_DRAW_TO_WINDOW |    // foramt muss im fenster sichtbar sien
            PFD_SUPPORT_OPENGL |    //unterstuetzt OpenGL
            PFD_DOUBLEBUFFER,       // doublebuffering wird unterstuetzt
            PFD_TYPE_RGBA,          // unterstuetzt RGB + alpha f.
            16,                   // farbtiefe
            0, 0, 0, 0, 0, 0,
            0,                      // kein alphabuffer
            0,                      // shift bit ignoriet
            0,                      // kein accumulationsbuffer
            0, 0, 0, 0,
            16,                     // 16-Bit Depth-Buffer
            0,                      // kein stencil buffer
            0,                      // kein auxiliary buffer
            PFD_MAIN_PLANE,         // hauptebene auf der später gezeichnet wird
            0,                      // unwichtig
            0, 0, 0 };              // keine ebenenmasken benötigt
    
            hDC = GetDC( hWnd );
            PixelFormat = ChoosePixelFormat( hDC, &pfd );
            SetPixelFormat( hDC, PixelFormat, &pfd );  // verwendet PixelFormat
            hRC = wglCreateContext(hDC);  
            wglMakeCurrent(hDC,hRC); // verucht hRC zu aktivieren
    
            ShowWindow( hWnd, SW_SHOW );    // zeigt fenster an
            ReSizeGLScene( width, height ); // aktiviert perspective
            InitGL();                       // läd die openGL ( texturen, lich .... )
    
            return true; // alles klappt
    }
    
    LRESULT CALLBACK WinProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam ) {
    
        switch( message ) {
    
            case WM_SIZE: {
    
                ReSizeGLScene( LOWORD( lParam ), HIWORD( lParam ) );
                return  0;
            }
    
            case WM_SYSCOMMAND: {   // ist ein systemcommand, wie zB.
                                    // "Bildschirmschoner soll gestartet werden!", vorhanden
                switch( wParam ) {
    
                    case SC_SCREENSAVE:    // bildschirmschoner soll gestartet werden
                    case SC_MONITORPOWER:   // monitor soll in standby
                    return 0;               // für beide fälle liefer NULL zurück
                }
                return 0;
            }
    
            case WM_KEYDOWN: {
    
                keys[wParam] = true;
    
                if( keys['I'] || keys['i'] ) {
    
                    zoom += 0.5f;
                    return 0;
                }
    
                if( keys['O'] || keys['o'] ) {
    
                    zoom -= 0.5f;
                    return 0;
                }
    
                if( keys['W'] || keys['w'] ) {
    
                    xmap += 0.5f;
                    return 0;
                }
    
                if( keys['S'] || keys['s'] ) {
    
                    xmap -= 0.5f;
                    return 0;
                }
    
                if( keys['A'] || keys['a'] ) {
    
                    ymap += 0.5f;
                    return 0;
                }
    
                if( keys['D'] || keys['d'] ) {
    
                    ymap -= 0.5f;
                    return 0;
                }
    
                if( keys[VK_LEFT] ) {
    
                    yrot += 1.0f;
                    return 0;
                }
    
                  if( keys[VK_RIGHT] ) {
    
                    yrot -= 1.0f;
                    return 0;
                }
    
                keys[wParam] = true;
    
                if( keys[VK_UP] ) {
    
                    xrot += 1.0f;
                    return 0;
                }
    
                  if( keys[VK_DOWN] ) {
    
                    xrot -= 1.0f;
                    return 0;
                }
    
                if( keys[VK_ESCAPE] ) {
    
                    SendMessage( hWnd, WM_DESTROY, 0, 0 );
                    return 0;
                }
                return 0;
            }
    
            case WM_KEYUP: {
    
                keys[wParam] = false;
                return 0;
            }
    
            case WM_DESTROY: {
    
                KillGLWindow();
                PostQuitMessage( 0 );
                return 0;
            }
        }
        return DefWindowProc( hWnd, message, wParam, lParam );
    }
    


  • Du hast keine Normalen definiert !

    Deswegen klappt die Beleuchtungsrechnung nicht, auch wenn du dein Würfel dann mit einer Textur versiehst !

    also glNormal3f verwenden !



  • Dann würd ich diese mal einbinden. Zum zweiten Problem siehe meinen vorherigen Post...

    grüße



  • David_pb schrieb:

    Hi!

    Sehr sinnig...

    Die .lib bindest du über die Projektoptionen oder über #pragma comment( lib, "glaux.lib" ) korrekt ein. Dann funktioniert das auch.

    grüße

    negativ!, wenn ich das tue bekomm ich nen fatal error der mir sagt das es die lib nicht gibt



  • Du wirst sie trotzallem benötigen!



  • ich habe niemals behauptet das ich sie nicht brauche, doch kann mir hier nicht jemand nen link zur downloadquelle der lib geben?



  • #pragma comment(lib, ...)
    

    ...versteht soviel ich weiss nicht jeder Compiler, evtl. musst du es "manuell" in den Projektoptionen deiner IDE einstellen.



  • geeky schrieb:

    #pragma comment(lib, ...)
    

    ...versteht soviel ich weiss nicht jeder Compiler, evtl. musst du es "manuell" in den Projektoptionen deiner IDE einstellen.

    Wie bereits erwähnt...


Anmelden zum Antworten