I need to bind a texture on a sphere, and my main problem is scaling an image. The program executing succeffully, and a test 128*128 textures binding succefully, too. But if i matching in a OpenDialog a texture, length and width of what isn’t a power of 2, program terminating after function gluScaleImage(…) vith an “Access violation” message. My texture-binding function is (on C++ Builder):
void __fastcall TFormMain::SetTexture()
{
glEnable(GL_TEXTURE_2D);
bitmap = new Graphics::TBitmap;
bitmap->LoadFromFile(OpenDialog1->FileName);
GLubyte bits[128][128][4];
Graphics::TBitmap *bitmap2;
if (div(bitmap->Width,2).rem == 0 && div(bitmap->Width,2).rem == 0)
{
for(int i = 0; i < 128; i++)
{
for(int j = 0; j < 128; j++)
{
bits[i][j][0]= (GLbyte)GetRValue(bitmap->Canvas->Pixels[i][j]);
bits[i][j][1]= (GLbyte)GetGValue(bitmap->Canvas->Pixels[i][j]);
bits[i][j][2]= (GLbyte)GetBValue(bitmap->Canvas->Pixels[i][j]);
bits[i][j][3]= (GLbyte)255;
}
}
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap->Width, bitmap->Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bits);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}
else
{
gluScaleImage(GL_RGBA,bitmap->Width,bitmap->Height,GL_UNSIGNED_BYTE,&bitmap,128,128,GL_UNSIGNED_BYTE,&bitmap2);
for(int i = 0; i < 128; i++)
{
for(int j = 0; j < 128; j++)
{
bits[i][j][0]= (GLbyte)GetRValue(bitmap2->Canvas->Pixels[i][j]);
bits[i][j][1]= (GLbyte)GetGValue(bitmap2->Canvas->Pixels[i][j]);
bits[i][j][2]= (GLbyte)GetBValue(bitmap2->Canvas->Pixels[i][j]);
bits[i][j][3]= (GLbyte)255;
}
}
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, bitmap2->Width,bitmap2->Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bits);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
}
}
You also can see this code in Examples/OpenGL/glSkeleton folder on a C++ Builder main folder.