Archief - [openGL] vraagje ivm performantie bij rendering

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Da nemesis

Legacy Member
Hey,


Kben sinds een paar dagen met openGL bezig en zit al met een probleempje.
Ik probeer meerdere objecten op het scherm te tonen en daar bewerkingen op te doen (rotate), echter gaat dit supertraag.

Het zijn maar 3 objecten: 2 getexturede kubussen en 1 textured vlak (de grond).

1 van deze kubussen wil ik laten ronddraaien door op z te drukken, dit lukt ook maar gaat supertraag (lage framerate denk ik).

Ik maak al gebruik van displaylists om het opbouwen te versnellen, indien ik dit niet doe, dan roteert die kubus tegen 1 frame per 5 seconden ofzo.

Weet iemand hoe ik dit kan oplossen?:s

dit zijn de functies die tekenen: (sorry voor de rommeligheid:))

Code:
void initRendering(){
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_COLOR_MATERIAL);

	_displayListId = glGenLists(3); //Make room for the display list
    glNewList(_displayListId, GL_COMPILE); //Begin the display list
    drawCube(0,0,0,1, "texture.bmp");
	glEndList(); //End the display list
	glNewList(_displayListId+1, GL_COMPILE); //Begin the display list
	drawCube(2,0,0,1, "baan.bmp");
	glEndList(); //End the display list
	glNewList(_displayListId+2, GL_COMPILE); //Begin the display list
	drawGround(-3,0,-3, 7, "baan.bmp");
	glEndList(); //End the display list

}

Code:
void drawCube(float x, float y, float z, float size, char *texture)
{

	Image* image = loadBMP(texture);
	_textureId = loadTexture(image);
	delete image;

	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, _textureId);

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

	glBegin(GL_QUADS);
	
	//front
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x, y, z);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x+size, y, z);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x+size, y+size, z);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x, y+size, z);

	//back
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x, y, z+size);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x+size, y, z+size);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x+size, y+size, z+size);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x, y+size, z+size);

	//left
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x, y, z);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x, y+size, z);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x, y+size, z+size);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x, y, z+size);

	//right
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x+size, y, z);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x+size, y+size, z);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x+size, y+size, z+size);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x+size, y, z+size);

	//bottom
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x, y, z);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x+size, y, z);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x+size, y, z+size);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x, y, z+size);

	//top
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x, y+size, z);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x+size, y+size, z);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x+size, y+size, z+size);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x, y+size, z+size);

	glEnd();
}

Code:
void drawGround(float x, float y, float z, float size, char* texture)
{
	Image* image = loadBMP(texture);
	_textureId = loadTexture(image);
	delete image;

	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, _textureId);

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

	glBegin(GL_QUADS);
	
	//bottom
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x, y, z);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x+size, y, z);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x+size, y, z+size);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x, y, z+size);

	glEnd();
}

Code:
void drawScene(void)
{
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
    glLoadIdentity(); //Reset the drawing perspective

	glRotatef(10, 1.0f, 0.0f, 0.0f);
    glTranslatef(-0.5f,-2.0f,-6.0f);					// Move Left 1.5 Units And Into The Screen 6.0

	glPushMatrix();
	
	//glColor3f(0.5f, 0.2f, 0.2f);
	//glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
	//drawCube(0,0,0,1, "texture.bmp");
	glCallList(_displayListId);
	glRotatef(-_angle, 0.0f, 1.0f, 0.0f); //Rotate about the z-axis
	glCallList(_displayListId+1);
	glPopMatrix();
	glCallList(_displayListId+2);
	glTranslatef(3.0f,0.0f,0.0f);

	//glPopMatrix();

	glutSwapBuffers(); //Send the 3D scene to the screen	
}


Weet iemand hier een oplossing voor?

Red2048

Legacy Member
Haal het texture laden uit uw Display Lists, per frame herlaad je alle textures opnieuw...

snel voorbeeld om je een idee te geven :

Code:
void initRendering(){

	// laad textures eenmalig

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

	Image* image1 = loadBMP("texture.bmp");
	_textureId1 = loadTexture(image1);
	delete image1;

	Image* image2 = loadBMP("baan.bmp");
	_textureId2 = loadTexture(image2);
	delete image2;

	//
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_COLOR_MATERIAL);

	_displayListId = glGenLists(3);

	glNewList(_displayListId, GL_COMPILE);
	drawCube(0,0,0,1, _textureId1 );	// gebruikt "texture.bmp"
	glEndList(); //End the display list

	glNewList(_displayListId+1, GL_COMPILE);
	drawCube(2,0,0,1, _textureId2);		// gebruikt "baan.bmp"
	glEndList(); //End the display list

	glNewList(_displayListId+2, GL_COMPILE);
	drawGround(-3,0,-3, 7, _textureId2);	// gebruikt "baan.bmp"
	glEndList(); //End the display list

}

void drawCube(float x, float y, float z, float size, int TEXID)
{

	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, TEXID);

	glBegin(GL_QUADS);
	
	//front
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x, y, z);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x+size, y, z);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x+size, y+size, z);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x, y+size, z);

	// ....................GEKNIPT......................
	//back
	//left
	//right
	//bottom
	//top

	glEnd();
}

void drawGround(float x, float y, float z, float size, int TEXID)
{

	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, TEXID);

	glBegin(GL_QUADS);
	
	//bottom
	glTexCoord2f(0.0f, 0.0f);
	glVertex3f(x, y, z);
	glTexCoord2f(1.0f, 0.0f);
	glVertex3f(x+size, y, z);
	glTexCoord2f(1.0f, 1.0f);
	glVertex3f(x+size, y, z+size);
	glTexCoord2f(0.0f, 1.0f);
	glVertex3f(x, y, z+size);

	glEnd();
}
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan