opengl讀取24位BMP檔案為紋理並處理黑色背景為透明
阿新 • • 發佈:2019-02-19
原理:
直接用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 }