GLUT - niesamowicie wolny

GLUT - niesamowicie wolny
M0
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:19
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?

Kopiuj
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

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około godziny
1

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

M0
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 11 lat
  • Postów:19
0

dzieki juz dziala :)

Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około godziny
1

parę uwag.

zamiast czegoś takiego

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

lepiej tak:

Kopiuj
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.

Kopiuj
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);
msm
+1 - a swoją drogą jeszcze lepiej użyć VertexBufferów. Ideałem byłoby zrezygnowanie w ogóle z fixed-pipeline, przy większych projektach tak jest dużo prościej, ładniej i daje większe możliwości (ale przy małych bardzo komplikuje niestety).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.