Hi. I know that if I render several quads, it’s better (in optimisation point of view) to put them in one glBegin - glEnd.
But I’ve got a problem with texturing quads this way - I use a tile based map, and render quads in two loops, like this:
for(int i = 0; i < SX; i++) {
for(int j = 0; j < SY; j++) {
glBindTexture(GL_TEXTURE_2D, appropriate texture id);
glBegin();
quad on appropriate position
glEnd();
}
}
The problem is that I cannot put glBegin and glEnd outside the two loops becouse it doesn’t bind textures then. What’s the solution to do that really quick ?
that the best way i know of doing it. And if i remember correctly
, the time it takes to do a new glBegin/End block is insignificant to binding a texture.
If I would sort my quads, then I ought to go via my loops n-times, where n == number of different textures. Are you sure that this method will be faster? I must calculate this. Thanks for your answers
myList = glGenLists(1);
glNewList(myList, GL_COMPILE);
FOR every texture
{
select texture
glBegin
FOR every quad
{
draw quad
}
glEnd
}
glEndList()
You do that only once during initialization. When you need to draw your quads, then you just call:
glCallList(myList);
As long as you do not need to modify your quads, then display list will be very good solutoin.
Otherwise you would have to use vertex arrays. Using immediate mode (glBegin/glEnd) without display list will always be a bit slow.
Of course, the pure CPU time of your application will be n times as much as without sorting, but usually the texture binding uses most of the time, so it’s better to bind textures outside the loop.
Assume you have n textures. Your algorithm does SXSY texture binds and quads. If you sort it per texture, you’ll have only n texture binds, and you still draw only SXSY quads. Your complexity is increased to nSXSY, but that’s not what is limiting your rendering speed.