MarcinMa Opublikowano 18 Stycznia 2011 Zgłoś Opublikowano 18 Stycznia 2011 Witam (Jestem w początkowej fazie pisania gier w opengl - wykonuje projekt na zaliczenie ) Mam problem- mianowicie po nałożeniu tekstur fps'y spadają mi z 50 , na 8 ... Stworzyłem model 'miasta' , którego bloki (boxy) tworzę za pomocą tablicy dwuwymiarowej ... Wszystko działa pięknie , ale przy nałożeniu textury mogę ręcznie fps'y liczyć ... Czy może mi ktoś wytłumaczyć / pokazać gdzie jest problem ? Funkcje odpowiadające za tworzenie box'a //drawBox i odpowiadająca za wczytanie tekstury otrzymałem od prowadzącego zajęcia ,więc sądzę ,że są poprawne ..pewnie ja gdzieś napaskudziłem próbując coś z nimi zrobić :/ Gdyby ktoś z Was wpadł na pomysł rozwiązania problemu ... prosił bym o wiadomość na gg (jeśli to możliwe) GG 2653087 Fragmenty kodu: funkcja tworząca box'y : static void drawBox( void ) { glBegin(GL_QUADS); glNormal3f( 0, 0, -1.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( -0.5f, +0.5f, -0.5f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( +0.5f, +0.5f, -0.5f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( +0.5f, -0.5f, -0.5f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( -0.5f, -0.5f, -0.5f ); glEnd(); glBegin(GL_QUADS); glNormal3f( 0, 0, 1.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( -0.5f, +0.5f, 0.5f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( +0.5f, +0.5f, 0.5f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( +0.5f, -0.5f, 0.5f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( -0.5f, -0.5f, 0.5f ); glEnd(); glBegin(GL_QUADS); glNormal3f( 1.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( +0.5f, +0.5f, -0.5f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( +0.5f, +0.5f, 0.5f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( +0.5f, -0.5f, 0.5f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( +0.5f, -0.5f, -0.5f ); glEnd(); glBegin(GL_QUADS); glNormal3f( -1.0f, 0.0f, 0.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( -0.5f, +0.5f, -0.5f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( -0.5f, +0.5f, 0.5f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( -0.5f, -0.5f, 0.5f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( -0.5f, -0.5f, -0.5f ); glEnd(); glBegin(GL_QUADS); glNormal3f( 0.0f, 1.0f, 0.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( -0.5f, +0.5f, -0.5f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( +0.5f, +0.5f, -0.5f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( +0.5f, +0.5f, +0.5f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( -0.5f, +0.5f, +0.5f ); glEnd(); glBegin(GL_QUADS); glNormal3f( 0.0f, -1.0f, 0.0f ); glTexCoord2f( 1.0f, 1.0f ); glVertex3f( -0.5f, -0.5f, -0.5f ); glTexCoord2f( 0.0f, 1.0f ); glVertex3f( +0.5f, -0.5f, -0.5f ); glTexCoord2f( 0.0f, 0.0f ); glVertex3f( +0.5f, -0.5f, +0.5f ); glTexCoord2f( 1.0f, 0.0f ); glVertex3f( -0.5f, -0.5f, +0.5f ); glEnd();} funkcja generująca bloki i nakładająca tekstury: void sciany (void) { glNewList(mapa,GL_COMPILE); int mac[8][6]={ {00,00,20,21,00,00}, {00,04,21,20,00,00}, {00,00,20,21,00,00}, {00,01,21,20,00,01}, {00,00,20,21,04,00}, {00,00,21,20,00,00}, {01,00,20,21,00,01}, {00,00,21,20,00,00}, } for (int ia=0;ia<70;ia++){ for (int ib=0;ib<6;ib++){ if(mac[ia][ib]==1){ //___________________________________________________________________________________B/A glPushMatrix(); glColor3f(0.39f, 0.32f, 0.32f); glTranslated(ia, 0.4, ib); glBindTexture( GL_TEXTURE_2D, 9); glScalef(1,1,1); CUTIL::drawBox(); glBindTexture( GL_TEXTURE_2D, 0 ); glPopMatrix(); }}glEndList();} tworzenie tekstury: static unsigned char* LoadBitmapFile( char *filename, BITMAPINFOHEADER *bitmapInfoHeader ) { FILE *filePtr; BITMAPFILEHEADER bitmapFileHeader; unsigned char *bitmapImage; int imageIdx = 0; unsigned char tempRGB; filePtr = fopen(filename, "rb"); if (filePtr == NULL) return NULL; fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr); fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr); fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET); bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage); if (!bitmapImage) { free(bitmapImage); fclose(filePtr); return NULL; } fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr); if (bitmapImage == NULL) { fclose(filePtr); return NULL; } for (imageIdx = 0; imageIdx < (int)bitmapInfoHeader->biSizeImage; imageIdx+=3) { tempRGB = bitmapImage[imageIdx]; bitmapImage[imageIdx] = bitmapImage[imageIdx + 2]; bitmapImage[imageIdx + 2] = tempRGB; } fclose(filePtr); return bitmapImage; } Ładowanie tekstur,oświetlenie tip... void CGL::init(void){ BITMAPINFOHEADER bitmapInfoHeader; unsigned char* bitmap_data = CUTIL::LoadBitmapFile( "1.bmp", &bitmapInfoHeader ); if( bitmap_data != NULL ) { glBindTexture(GL_TEXTURE_2D, 9); 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, GL_RGB, bitmapInfoHeader.biWidth, bitmapInfoHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, bitmap_data); glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); glEnable(GL_TEXTURE_2D); } mapa=glGenLists(1); // ustawienie parametrow kamery glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective( 50, 1, 1, 1000); gluLookAt( 0, 0, -7, 0, 0, 0, 0, 1, 0 ); // wyzerowanie transformacji modelu glMatrixMode(GL_MODELVIEW); glLoadIdentity(); sciany(); glEnable( GL_DEPTH_TEST ); // wlaczenie bufora Z glEnable( GL_NORMALIZE ); // wlaczenie automatycznej normalizacji wektorow po skalowaniu // ustawienie parametrow zrodel swiatla //wartości składowe oświetlenia i koordynaty źródła światła GLfloat ambientLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };//swiatło otaczające GLfloat diffuseLight[] = { 0.5f, 0.5f, 0.5f, 1.0f };//światło rozproszone GLfloat specular[] = { 0.40f, 0.40f, 0.40f, 1.0f}; //światło odbite GLfloat lightPos[] = { 50, 20, 3, 1 };//pozycja światła //(czwarty parametr określa odległość źródła: //0.0f-nieskończona; 1.0f-określona przez pozostałe parametry) glEnable(GL_LIGHTING); //uaktywnienie oświetlenia //ustawienie parametrów źródła światła nr. 0 glLightfv(GL_LIGHT0,GL_AMBIENT,ambientLight); //swiatło otaczające glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuseLight); //światło rozproszone glLightfv(GL_LIGHT0,GL_SPECULAR,specular); //światło odbite glLightfv(GL_LIGHT0,GL_POSITION,lightPos); //pozycja światła glEnable(GL_LIGHT0); //uaktywnienie źródła światła nr. 0 glEnable(GL_COLOR_MATERIAL); //uaktywnienie śledzenia kolorów glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE); //kolory ustalone za GLfloat specref[] = { 0.5f, 0.5f, 0.5f, 0.5f };//parametry odblaskowości glMaterialfv(GL_FRONT, GL_SPECULAR,specref); glMateriali(GL_FRONT,GL_SHININESS,120); glClearColor( 0.99 , 0.99 ,0.99 , 0 ); // ustawienie koloru tla glClear( GL_COLOR_BUFFER_BIT ); glShadeModel( GL_SMOOTH ); // wlaczenie cieniowania Gouraud'a (smooth shading) glLoadIdentity(); cgl.aseGeometry = CUTIL::loadASE( "chillmod.ase" ); cgl.aseGeometry1 = CUTIL::loadASE( "logo.ase" ); cgl.aseGeometry2 = CUTIL::loadASE( "logoa.ase" ); cgl.dom = CUTIL::loadASE( "dom.ase" );} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
CoVert Opublikowano 17 Lutego 2011 Zgłoś Opublikowano 17 Lutego 2011 (edytowane) Nie znam się na openGL ale masz rażący błąd w iteracji pętli. W efekcie wykonuje się 5600x zamiast 48x i narusza pamięć - w efekcie nie wiadomo ile razy może się wykonać drawbox tak samo jak nie wiem jak się zachowa glTranslated(ia, 0.4, ib); ze niepoprawnymi wartościami itd. Raczej nie tutaj tkwi problem bo ten fragment wykonuje się tylko raz przy inicjalizacji ale i tak to popraw :) void sciany (void) { glNewList(mapa,GL_COMPILE); int mac[8][6]={ {00,00,20,21,00,00}, {00,04,21,20,00,00}, {00,00,20,21,00,00}, {00,01,21,20,00,01}, {00,00,20,21,04,00}, {00,00,21,20,00,00}, {01,00,20,21,00,01}, {00,00,21,20,00,00}, } for (int ia=0;ia<70;ia++){ //70 zamiast 7 for (int ib=0;ib<6;ib++){ //6 zamiast 5 - mac ma wymiary 8x6 wiec jej indexy to 0..7 i 0..5 if(mac[ia][ib]==1){ //___________________________________________________________________________________B/A glPushMatrix(); glColor3f(0.39f, 0.32f, 0.32f); glTranslated(ia, 0.4, ib); glBindTexture( GL_TEXTURE_2D, 9); glScalef(1,1,1); CUTIL::drawBox(); glBindTexture( GL_TEXTURE_2D, 0 ); glPopMatrix(); }} Edytowane 17 Lutego 2011 przez CoVert Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...