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

opengl读取24位BMP文件为纹理并处理黑色背景为透明

2014-05-26 13:23 519 查看
原理:

直接用BITMAP数据而未用到AUX库和windows LoadImage API

24位BItMap文件格式不细说,见度娘

格式要求:24位无压缩位图,必须是2^n*2^n大小

代码(C/C++)纯手写,勿喷。。。

int LoadGLTextures(char *Filename, GLuint *ttexture, int i)//ttexture[i]为用来绑定纹理数据的整数,可更改
{
FILE *File;
BITMAPINFOHEADER header;
BYTE *texture;//texture长宽和像素RGBA texture[width][height][4]
int width, height,m,j;
unsigned char *image;
File = fopen(Filename, "rb");
//读取BMP信息头,跳过14字节文件头
if (File){
fseek(File, 14, SEEK_SET);
fread(&header, sizeof(BITMAPINFOHEADER), 1, File);
}
else return FALSE;
//读取长宽
width = header.biWidth;
height = header.biHeight;
//为image分配像素空间,读取图片数据,为texture分配width*height*4的四位空间用来生成纹理
image = (unsigned char *)malloc(width*height * 3);
fread(image, sizeof(unsigned char), width*height * 3, File);//唯一的不足之处在于将3字节像素读为一维字符串
texture = (BYTE *)malloc(width*height * 4);// 唯一的不足之处在于将4字节像素读为一维字符串
//以下代码将对texture重排列,一般来说为Blue Green Red Alpha格式(24位图格式),生成纹理使用BGRA模式
/****************************************修改模块,通过像素任意修改图片,示例:*************************************************************/
//本段代码将纯黑色像素点透明度(Alpha)设为100%,其余颜色设为0%
for (m = 0; m<width; m++)
{
for (j = 0; j<height; j++)
{
//把颜色值写入
texture[m*width * 4 + j * 4] = image[m*width * 3 + j * 3];
texture[m*width * 4 + j * 4+1] = image[m*width * 3 + j * 3 + 1];
texture[m*width * 4 + j * 4+2] = image[m*width * 3 + j * 3 + 2];
//设置alpha值,假设黑色为透明色
if (texture[m*width * 4 + j * 4] == 0 && texture[m*width * 4 + j * 4 + 1] == 0 && texture[m*width * 4 + j * 4+2] == 0)
texture[m*width * 4 + j * 4+3] = 0;                 //透明,alpha=0
else
texture[m*width * 4 + j * 4+3] = 255;           //不透明,alpha=255
}
}
//ttexture[i]为绑定纹理的整数
//下面生成纹理以及纹理处理
glGenTextures(1, &ttexture[i]);
glBindTexture(GL_TEXTURE_2D, ttexture[i]);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
gluBuild2DMipmaps(GL_TEXTURE_2D, 4, width, height, GL_BGRA, GL_UNSIGNED_BYTE, texture);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glAlphaFunc(GL_GREATER, 0.5);//使Alpha值生效
//纹理生成完毕,下面释放空间
free(texture);
free(image);						// 释放图像数据
return TRUE;								// 返回 Status
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: