Problem mit TextureMapping + Lichteffekt in OpenGL (! Laden der Bitmap + Verwnden), Bitte um HILFE
-
hallo erst mal alle zusammen,
ich habe ein problem damit eine bitmap ins programm bzw. project zu laden. ich habe mir nen header erstellt mit ner ID fuer die jeweilige .bmp: -> #define IDT_BITMAP_001 100 . dann hab ich diese in nen resource datei included und der ID den aufenthaltsort der .bmp mit geteilt: -> IDT_BITMAP_001 BITMAP "bitmap1.bmp" . anschliessend habe ich die .rc datei meinem project hinzugefuegt und ebenso die header datei. nun will ich diese .bmp in mein project laden fuer die arbeit mir textureMapping (fuer ein Geometrischen Würfel). ich arbeite zur zeit mit dem Tutorial von NeHe( deu ), dort stand das laden der .bmp wie folgt beschrieben:int LoadGLTextures() { bool Status = false; AUX_RGBImageRec *TextureImage[1]; memset( TextureImage, 0, sizeof( void* ) *1 ); TextureImage[0] = auxDIBImageLoad( "bitmap1.bmp" ); Status = true; glGenTextures( 1, &texture[0] ); glBindTexture( GL_TEXTURE_2D, texture[0] ); glTexImage2D( GL_TEXTURE_2D, 0, 3, TextureImage[0] -> sizeX, TextureImage[0] -> sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0] -> data ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); if( TextureImage[0] ) { if( TextureImage[0] -> data ) { free( TextureImage[0] -> data ); } free( TextureImage[0] ); } return Status; }ich habe die glaux.lib eingebundn mit #include <gl\glaux.h>, dennoch tritt folgender fehler auf:
[Linker Error] Unresolved external 'auxDIBImageLoadA' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\OPENGL_3D_LIGHT.OBJgibt es denn da kein anderen weg die Bitmap zu laden???
das ist eigentlich erst mal mein hauptproblem. ein anderes das mich beschäftigt ist, der licht effekt. also wenn ich 3 GLfloat's arrays deffiniere mit:
GLfloat LightAmbient[] = { 0.5f, 0.5f, 0.5f, 1.0f }; GLfloat LightDiffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; GLfloat LightPosition[] = { 0.0f, 0.0f, 2.0f, 1.0f };und diese dann in meiner funktion IntGL(), wie folgt verwende:
glLightfv( GL_LIGHT1, GL_AMBIENT, LightAmbient ); glLightfv( GL_LIGHT1, GL_DIFFUSE, LightDiffuse ); glLightfv( GL_LIGHT1, GL_POSITION, LightPosition ); glEnable( GL_LIGHTING ); glEnable( GL_LIGHT1 );und nun mein Würfel rotieren lasse ist es erst mal so das der würfel komplett weiß ist da hier noch die texture fehlt, aber dreht er sich nun, ist es so das er völlig weiß ist, da er gerade von vorne angeleuchtet wird, rotiert er aber weiter, klinkt die beleuchtung ab bis er dann völlig unbeleuchtet ist, und nach einiger zeit wenn er weit genug rotiert ist wird er wieder heller. wieso??? die lichtquelle ist doch festgelegt so muesste er doch die ganze zeit von vorne beleuchtet sein. oder etwa nicht?? oder liegt es daran das die textur fehlt????
an bei: ich programmier unter BCB6!
wär voll super wenn ihr mir helfen koennt. ein D!CKES DANKE!, gibts jetz schon.
-
Zur Beleuchtung :
Die Farbe deiner beleuchteten Objekte hängt immer mit der "Kameraposition" und Lichtposition zusammen. Weiterhin ist die Definition des Materials und die Normalen des Objektes wichtig.
Welche Materialparameter hast du für deinen Würfel benutzt?
Sind die Normalen der Würfelflächen richtig?Die Beleuchtung sollte dann mit zunehmendem Winkel zwischen "Kameraposition" und Normale abklingen ...
-
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...