您的位置:首页 > 运维架构

OpenGL从图片文件加载Texture时的上下颠倒问题

2010-09-15 20:55 501 查看
在NeHe的教程6中,从BMP文件加载Texture时直接使用了auxDIBImageLoad(Filename);,而在JOGL和Android版本的代码中,你可以看到在使用了BufferedImage或者Bitmap类加载完图片文件后,都做了一个颠倒图片上下的操作。原因很简单,gluBuild2DMipmaps接收的图像数据是原始的BMP文件数据,在BMP文件中,是从图片的最后一行开始存储的,而BufferedImage或者Bitmap加载图片后的数据是从第一行开始存储的,所以需要颠倒一下。另外还要注意glTexImage2D需要指定数据中RGB三个分量的排列顺序。

以下是网上找到的一个Loading a BMP without AuxDIBImageLoad()例程,可以很明显看到BMP文件数据被直接送给了gluBuild2DMipmaps,验证了前面的推断。

unsigned int LoadTex(string Image)
{
unsigned int Texture;
FILE* img = NULL;
img = fopen(Image.c_str(),"rb");
unsigned long bWidth = 0;
unsigned long bHeight = 0;
DWORD size = 0;
fseek(img,18,SEEK_SET);
fread(&bWidth,4,1,img);
fread(&bHeight,4,1,img);
fseek(img,0,SEEK_END);
size = ftell(img.file) - 54;
unsigned char *data = (unsigned char*)malloc(size);
fseek(img,54,SEEK_SET);    // image data
fread(data,size,1,img);
fclose(img);
glGenTextures(1, &Texture);
glBindTexture(GL_TEXTURE_2D, Texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bWidth, bHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
if (data)
free(data);

return Texture;
}
bool texLoaded = false;
unsigned int texture;
...
if (!texLoaded)
{
texture = LoadTex("omfgleebhax.bmp");     // load the texture
texLoaded = true;
}
glBindTexture(GL_TEXTURE_2D, texture);     // bind the texture
// draw your stuff here
// blah blah
// blah blah
// blah.
....
// blah
// Last one, I promise...
// blah.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐