不用AuxDIBImageLoad()向opengl中載入bmp紋理


不用AuxDIBImageLoad()向opengl中載入bmp紋理 這個函數從硬盤中加載24位window DIB 位圖。呵呵,解釋的多了。為了節約時間,我沒有加載整個bmp圖的Header部分,而僅僅獲取我們需要的部分:寬度,高度,和圖片大小。 下面是代碼部分 

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;
}



正如你可以看到,bitmap的寬度和高度偏移量為18和24尺寸准確,我們只是整個文件的大小減去54(大小我們得到一個准確的讀數文件頭的大小有時會出現故障。

用這個函數是相當容易的,就像是加載一個普通的紋理一樣。


 

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




我發現這個函數比調用AuxDIBImageLoad()或者win32 API要快,呵呵。如此之酷。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM