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

Logowanie »
Rejestracja
Pomoc
Dodaj odpowiedź
Cytuj