[c++] problem i glut med GameMode

Permalänk
Medlem

[c++] problem i glut med GameMode

Har problem med GameMode i GLUT.
När jag kör windowed så är det perfekt, men när jag ställer in upplösning 800x600 så blir det rätt med grafiken (förutom att ljus inte funkar), men det går supah-segt.
Om jag istället ställer in 800x600:32 så blir det snabbt, jag ser inge diffuse ljus, men ambient funkar...
Här är koden:

#pragma comment(lib, "opengl32.lib") #pragma comment(lib, "glut32.lib") #pragma comment(lib, "glu32.lib") #pragma comment(lib, "glaux.lib") #include <windows.h> #include <gl\glut.h> #include <gl\glaux.h> #include <stdio.h> void render (); void reshape (int w, int h); GLuint g_MinTextur[3]; float fRotation; float AmbientColor[] = { 1.0f, 0.0f, 0.0f}; float DiffuseColor[] = { 0.0f, 1.0f, 0.0f}; float LightPosition[] = { 0.0f, 0.0f, 2.0f}; bool g_bFullScreen = true; AUX_RGBImageRec *LoadBMP (char *strFileName) { if (!strFileName) return NULL; FILE *File = NULL; File = fopen (strFileName, "r"); if (File) { fclose (File); return auxDIBImageLoad (strFileName); } return NULL; } bool LoadTextures () { bool bRet; AUX_RGBImageRec *TextureImage = NULL; if (TextureImage = LoadBMP ("Textur.bmp")) { bRet = true; glGenTextures (3, &g_MinTextur[0]); glBindTexture (GL_TEXTURE_2D, g_MinTextur[0]); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexImage2D (GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data); glBindTexture (GL_TEXTURE_2D, g_MinTextur[1]); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexImage2D (GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data); glBindTexture (GL_TEXTURE_2D, g_MinTextur[2]); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST); gluBuild2DMipmaps (GL_TEXTURE_2D, 3, TextureImage->sizeX, TextureImage->sizeY, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data); } if (TextureImage) { if (TextureImage->data) free (TextureImage->data); free (TextureImage); } return bRet; } int main (int argc, char** argv) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); if (g_bFullScreen) { glutGameModeString ("800x600:32@100"); if (glutGameModeGet (GLUT_GAME_MODE_POSSIBLE)) { glutEnterGameMode (); } else { printf ("Couldn't use fullscreen!"); glutInitWindowSize (400, 400); glutInitWindowPosition (100, 100); glutCreateWindow ("Test-ost!"); } } else { glutInitWindowSize (400, 400); glutInitWindowPosition (100, 100); glutCreateWindow ("Test-ost!"); } glutDisplayFunc (render); glutIdleFunc (render); glutReshapeFunc (reshape); glEnable (GL_DEPTH_TEST); glEnable (GL_TEXTURE_2D); glEnable (GL_LIGHT1); glEnable (GL_LIGHTING); LoadTextures (); glLightfv (GL_LIGHT1, GL_AMBIENT, AmbientColor); glLightfv (GL_LIGHT1, GL_DIFFUSE, DiffuseColor); glLightfv (GL_LIGHT1, GL_POSITION, LightPosition); glutMainLoop (); return 0; } void reshape (int w, int h) { if (h == 0) h = 1; glMatrixMode (GL_PROJECTION); glLoadIdentity (); glViewport (0, 0, w, h); gluPerspective (45, 1.0 * (w / h), 1.0f, 1000.0f); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); gluLookAt (0.0f, 0.0f, 4.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); } void render () { fRotation += 0.2; glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glPushMatrix (); glBindTexture (GL_TEXTURE_2D, g_MinTextur[1]); glRotatef (fRotation, 1.0f, 0.0f, 0.0f); glRotatef (fRotation * 2, 0.0f, 1.0f, 0.0f); glRotatef (fRotation, 0.0f, 0.0f, 1.0f); glBegin (GL_QUADS); glNormal3f( 0.0f, 0.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glNormal3f( 0.0f, 0.0f,-1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glNormal3f( 0.0f, 1.0f, 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glNormal3f( 0.0f,-1.0f, 0.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glNormal3f( 1.0f, 0.0f, 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); glNormal3f(-1.0f, 0.0f, 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); glEnd(); glPopMatrix (); glutSwapBuffers (); }

Visa signatur

Min utvecklingsblogg: http://blog.iostream.cc

Permalänk
Medlem

Din reshape(int w,int h) verkar fuckad, kanske.
"1.0 * (w / h)" undra om det blir en int divition? Annars är nog "(float)w / (float)h" bättre i vilket fall. Och varför ha gluLookAt() där?

Jag antar att normalerna är rätt, orkar inte titta helt slut efter en tenta.

Visa signatur

Perl - Made by Idiots, Java - Made for Idiots, C++ - Envied by Idiots

Permalänk
Medlem

w och h kan väl aldrig vara floats, det är ju upplösningen, man brukar ju inte ha 640,5 och 480,7 i upplösning?
Ska testa med att kasta till float...

Edit:
Testat att kasta nu... ingen skillnad

Visa signatur

Min utvecklingsblogg: http://blog.iostream.cc

Permalänk
Medlem

Hehe, näe man brukar aldrig ha en sån upplösning, men det sa jag inte heller. gluPerspective ska ha en float som bestämmer aspect ratiot, vanligtvis 4/3 = 1.333... och du får inga decimaler om du delar två ints.

Visa signatur

Perl - Made by Idiots, Java - Made for Idiots, C++ - Envied by Idiots

Permalänk
Medlem

Jo, men funkar ändå inte :(.
Går mycket segt och diffuse funkar ej
perfekt i window.

Visa signatur

Min utvecklingsblogg: http://blog.iostream.cc

Permalänk
Medlem

Aha, jag kolla igenom koden noggrannare och hitta felet...

Du glömde sista siffran i attrubuten...

float AmbientColor[] = { 1.0f, 0.0f, 0.0f,1.0f};
float DiffuseColor[] = { 0.0f, 1.0f, 0.0f,1.0f};
float LightPosition[] = { 0.0f, 0.0f, 2.0f,1.0f};

Sätter du 0.0f som sista element i Position så blir det ljus som inte kommer ifrån nån punkt, men går efter en vektor (som solen). På Ambient och Diffuse kommer jag inte ihåg vad sista parametern gör.

Visa signatur

Perl - Made by Idiots, Java - Made for Idiots, C++ - Envied by Idiots

Permalänk
Medlem

Tack!
Klantigt av mig!!
Kör 800x600:32 nu... funkar perfa och snabbt

Visa signatur

Min utvecklingsblogg: http://blog.iostream.cc