GLUT - niesamowicie wolny

0

Witam,
Napisalem klase, ktora wczytuje dane z pliku.
W pliku tym mam informacje dot. położenia wierzcholkow modelu, polaczenia wierzcholkow, ktore tworza dany trojkat, oraz dane do normali.

Wykorzystalem w tym celu dwuwymiarowe tablice dynamiczne o wielkosci [iloscWierzcholkow][3], podobnie jest z innymi.
Model wczytuje mi sie idealnie, wszystko dziala.
Jednak kiedy proboje obracac model pod danym katem lub tez dokonywac innych transformacji nie jest juz tak fajnie.
Obraca sie bardzo powoli, nawet w przypadku prostych modeli typu opona, czajnik, stozek itp. Maja one tylko kilkadziesiąt wierzcholków.

Plynnie dziala jedynie przy prostopadloscianach.

Nie wiem w czym leży problem.
Kiedy wgram sobie model o bardzo rozbudowanej siatce, to wszelkie transormacje to już tragedia. Wszystko jest bardzo wolno.

Im mniejsza siatka modelu, tym wzrost szybkosci.

W jaki sposób mogę to zoptymalizowac?

void genereateScene(void)
{
	int ilosc;
	int ilosc2;
	float **zmienna;
	int **zmienna2;
	float **zmienna3;
	ModelASE map1;
	map1.LoadFile();
	ilosc = map1.GetVertexNumbers();
	zmienna = map1.GetVertex(ilosc);

	ilosc2=map1.GetMeshNumFaces();
	zmienna2 = map1.GetFaces(ilosc2);
	zmienna3 = map1.GetFacesNormals(ilosc2);
	map1.SetModel(ilosc2);


	glClearColor(0.1f, 0.1f, 0.1f, 1.0f);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

	glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
    GLfloat lightColor[] = {0.7f, 0.7f, 0.7f, 1.0f};
    GLfloat lightPos[] = {-2 * 2, 2, 4 * 2, 1.0f};
    glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
    glLightfv(GL_LIGHT0, GL_POSITION, lightPos);


	glPushMatrix();
	glTranslatef(0.0f, 0.0f, poz);
	glRotatef(_angle, 0.0f, 1.0f, 0.0f);
	glBegin(GL_TRIANGLES);

	for(int i = 0; i<ilosc2; i++)
	{
		glNormal3f(zmienna3[i][0], zmienna3[i][1], zmienna3[i][2]);
		glColor3f(0.0f, 0.0f, 1.0f);
			
		for(int j = 0; j<3; j++)
		{
		glVertex3f(map1.Triangles.Face[i].Vertex[j].x, map1.Triangles.Face[i].Vertex[j].y, map1.Triangles.Face[i].Vertex[j].z);
		}
	}
	glEnd();
	glPopMatrix();
	glutSwapBuffers();
}

Dziekuje, pozdrawiam

1

czy ja dobrze widzę, że za każdą klatką ładujesz dane z pliku na nowo?

0

dzieki juz dziala :)

1

parę uwag.

zamiast czegoś takiego

  glVertex3f(map1.Triangles.Face[i].Vertex[j].x, map1.Triangles.Face[i].Vertex[j].y, map1.Triangles.Face[i].Vertex[j].z);

lepiej tak:

glVertex3fv(map1.Triangles.Face[i].Vertex[j]);

przy czym Vertex[j] musi być wtedy tablicą trzech floatów.

idąc dalej, w ogóle zamiast schematu: glBegin — glVertex w pętli — glEnd, lepiej od razu przygotować tablice w odpowiednim formacie (bo i tak je tworzysz, z tego co widać), i wysłać wszystko na raz.

GLfloat vertices[], normals[], colors[]; // tablice wypełnić.

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glVertexPointer(3, GL_FLOAT, 0, vertices);
glNormalPointer(GL_FLOAT, 0, normals);
glColorPointer(4, GL_FLOAT, 0, colors);

glDrawArrays(GL_TRIANGLES, 0, vertex_count);
// albo
glDrawElements(...);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

1 użytkowników online, w tym zalogowanych: 0, gości: 1