opengl读取24位BMP文件为纹理并处理黑色背景为透明
2014-05-26 13:23
519 查看
原理:
直接用BITMAP数据而未用到AUX库和windows LoadImage API
24位BItMap文件格式不细说,见度娘
格式要求:24位无压缩位图,必须是2^n*2^n大小
代码(C/C++)纯手写,勿喷。。。
直接用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 }
相关文章推荐
- FreeImage读取纹理,在OpenGL中实现透明纹理
- 读取dds文件转为opengl纹理
- 【OPENGL】读取并显示BMP文件
- 【OpenGL】OpenGL加载24位真彩色bmp图片或者256色bmp图片制作作纹理
- 类:CTexture,OpenGL中读取多种纹理的类。支持bmp,tga,rgb,rgba等
- 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
- c++读取BMP文件(24位)
- bmp位图文件:读取、写入、24位真彩转8位灰度、灰度图的二值化
- OpenGL纹理贴图24位bmp图片,代码如下
- 关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题
- 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
- openGL可编程笔记二——解码bmp文件并添加纹理
- 读取dds文件转为opengl纹理
- 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现
- 关于Opengl中将24位BMP图片加入一个alpha通道并实现透明的问题
- VC++使用CImage PNG转BMP图片透明背景处理
- VC++使用CImage PNG转BMP图片透明背景处理
- OpenGL学习--05--纹理立方体--BMP文件格式详解(转载)
- 关于Opengl中将24位BMP图片加入�一个alpha通道并实现透明的问题
- 【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现(转载)