PDA

View Full Version : How fast can you texture?



ewanspeirs
04-02-2001, 12:14 PM
Hi, I'm looking for some performance advice for texture mapping, specifically how to achieve the highest frame rates with 'large' texture files.

I use my texture as a background for coding GIS type data on top off (i.e. my texture is an a aerial photograph). Because of this my texture could be much more than the maximum of 1024x1024 pixels allowed by OpenGl (is that correct ?). Currently I restrict the max texture size I can use to 1024x124.

So my question is which will render faster, one large texture (say 1024x124) or X number of small textures (say 4 x 512x512) ?

If it's the case that many small textures can be drawn faster than one large texture, how should I approach splitting up my one large texture into multiple 2^X smaller textures ? More importantly how can I scale/stretch my texture (the char* part ) to make sure the many smaller parts conform to 2^X while marinating the integrity of the image ? Any code suggestions etc. are welcome as this has me completely stumped !

Currently when I render my single texture (max size 1024x124) I map it to a simple Quad, I use the code below to carry out the mapping/rendering; the drawing part of this code is inside a display list to help improve re-draw times. Is there a quicker way ?

Any help etc. is appreciated, I'm stuck !

Thanks in advance,
Ewan

/* ================================================== ===
* Bind the texture data to the gl texture object 'new_texture_id' , only used
* once when the texture file (a BMP) is processed */
{
glBindTexture(GL_TEXTURE_2D, new_texture_id);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

/* scaling a streching */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

/* bind the texture */
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, no_boarder,
GL_RGB, GL_UNSIGNED_BYTE, texture_rgb_char_data);
}


/* ================================================== ===
* now map the texture to the quad, this section is inside the display list */
{
glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, id);

glBegin(GL_QUADS);
/* lower left corner */
glTexCoord2f(0.0f,0.0f);
glVertex3f(-texture_width/2, -texture_height/2, texture_z_offset);
/* lower right corner */
glTexCoord2f(1.0f, 0.0f);
glVertex3f(texture_width/2, -texture_height/2, texture_z_offset);
/* upper right corner */
glTexCoord2f(1.0f, 1.0f);
glVertex3f(texture_width/2, texture_height/2, texture_z_offset);
/* upper left corner */
glTexCoord2f(0.0f, 1.0f);
glVertex3f(-texture_width/2, texture_height/2, texture_z_offset);
glEnd ();

glDisable (GL_TEXTURE_2D);
}

zed
04-02-2001, 01:44 PM
* about splitting up the texture its a case of test + see. one advantage i see though is if you use mipmapping and say the textures at the bottom are using mipmap level 0 + at the top using mipmap level 1. this is gonna give you a speed advantage. cause if its just one polygon u would have to use the same level on the whole of the polygon.
* try decresing the size of your internal texture format eg GL_R5_G6_B5 instead of GL_RGB (in 32 bit colour this might use GL_RGB8)
* display lists/vertex arrays i cant really see helping out with so few polygons. and so few statechanges.

j
04-02-2001, 02:23 PM
The maximum texture size in OpenGL is implementation dependant. For TNT and higher nVidia cards, it is 2048x2048. Probably the same thing for the Radeon and Voodoo 4/5. Voodoo 3 can only handle 256x256.

j