Skocz do zawartości
MarcinMa

[OpenGl / C++] Spadek fps przy nakładaniu tekstur -Problem

Rekomendowane odpowiedzi

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" );}

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

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 przez CoVert

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

Ładowanie


×
×
  • Dodaj nową pozycję...