大家在OpenGL中一般是用aux庫(kù)的auxDIBImageLoad()函數(shù)來(lái)加載BMP格式的圖片來(lái)作為紋理,這個(gè)確實(shí)是比較簡(jiǎn)單易用,但aux庫(kù)的性能不佳,經(jīng)常會(huì)出問(wèn)題,穩(wěn)定性較差。所以一般最好不要用aux庫(kù),可以用glut庫(kù),但glut庫(kù)沒(méi)有紋理加載函數(shù)。而有些程序是直接讀取BMP格式來(lái)獲得圖像數(shù)據(jù),從而生成紋理的,這種方法雖然很強(qiáng)大,但比較復(fù)雜,需要了解BMP的格式,對(duì)初學(xué)者比較困難。而下面的一段程序是用windows的API函數(shù)LoadImage()來(lái)實(shí)現(xiàn)這個(gè)功能,這種實(shí)現(xiàn)方法很簡(jiǎn)單,可以說(shuō)比auxDIBImageLoad()函數(shù)復(fù)雜不了多少。
首先,加上頭文件:
#include <gl\glext.h>
這是因?yàn)楹竺娴?/span>GL_BGR_EXT是定義在這個(gè)頭文件里的,因?yàn)?/span>BMP格式是按Blue,Green,Red順序儲(chǔ)存圖像數(shù)據(jù)的,這與OpenGL中正好相反。GL_BGR_EXT就是完成兩者之間的轉(zhuǎn)換的。
下面就是不用AUX庫(kù)來(lái)加載BMP圖片作為紋理的函數(shù):
bool LoadTexture(LPTSTR szFileName, GLuint &texid) // Creates Texture From A Bitmap File
{
HBITMAP hBMP; // Handle Of The Bitmap
BITMAP BMP; // Bitmap Structure
glGenTextures(1, &texid); // Create The Texture
hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );
if (!hBMP) // Does The Bitmap Exist?
return FALSE; // If Not Return False
GetObject(hBMP, sizeof(BMP), &BMP); // Get The Object
// hBMP: Handle To Graphics Object
// sizeof(BMP): Size Of Buffer For Object Information
// &BMP: Buffer For Object Information
glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // Pixel Storage Mode (Word Alignment / 4 Bytes)
// Typical Texture Generation Using Data From The Bitmap
glBindTexture(GL_TEXTURE_2D, texid); // Bind To The Texture ID
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Min Filter
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Mag Filter
glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits);
DeleteObject(hBMP); // Delete The Object
return TRUE; // Loading Was Successful
}
聯(lián)系客服