Im trying to create a polygon with texture in opengl using this Nehe Loadraw
GLuint LoadTextureRAW( const char * filename, int wrap )
{
GLuint texture;
int width, height;
Byte * data;
FILE * file;
// open texture data
file = fopen( "Data/raw.raw", "rb" );
if ( file == NULL ) return 0;
// allocate buffer
width = 256;
height = 256;
data = malloc( width * height * 3 );
// read texture data
fread( data, width * height * 3, 1, file );
fclose( file );
// allocate a texture name
glGenTextures( 1, &texture );
// select our current texture
glBindTexture( GL_TEXTURE_2D, texture );
// select modulate to mix texture with color for shading
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
// when texture area is small, bilinear filter the closest MIP map
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
GL_LINEAR_MIPMAP_NEAREST );
// when texture area is large, bilinear filter the first MIP map
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
// if wrap is true, the texture wraps over at the edges (repeat)
// ... false, the texture ends at the edges (clamp)
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
wrap ? GL_REPEAT : GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
wrap ? GL_REPEAT : GL_CLAMP );
// build our texture MIP maps
gluBuild2DMipmaps( GL_TEXTURE_2D, 3, width,
height, GL_RGB, GL_UNSIGNED_BYTE, data );
// free buffer
free( data );
return texture;
}
and then create the polygons
texture = LoadTextureRAW( “texture.raw”, TRUE );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
glBegin( GL_POLYGON );
glVertex3f( -42.0f, -42.0f, 0.0f );
glTexCoord2f( 0.0f, 0.0f );
glVertex3f( 42.0f, -42.0f, 0.0f );
glTexCoord2f( 1.0f, 0.0f );
glVertex3f( 42.0f, 42.0f, 0.0f );
glTexCoord2f( 1.0f, 1.0f );
glVertex3f( -42.0f, 42.0f, 0.0f );
glTexCoord2f( 0.0f, 1.0f );
glEnd();
how can i change it to load any size of image not only power of 2 and to create the polygons using the side of the texture instead the coordinates
You’ve asked several different questions.
RAW is not really an “image format” so much as a binary dump of image data. RAW images don’t contain information about how big they are (or what format they are, for that matter). You’re expected to know, via other means, how big it is.
What you need to do is use a proper image loading library to load a real image format. Some of those are just generic image loaders, but others are designed for integration with OpenGL and can automatically create textures for you.
A proper image loader have APIs to tell you how big the image is (as well as format information).
Note that OpenGL 2.0 and above supports non-power-of-two images.
gluBuild2DMipmapsdoes not! At least, not correctly.gluBuild2DMipmapswill attempt to scale any non-power-of-two image into a power-of-two one. So you need to use the actual OpenGL calls (GLU is not really part of OpenGL. It sits on top of GL) likeglTexImage2D.This answer provides all the information you need for this process.