OpenGL載入DDS壓縮紋理
網路上的影象庫很多,如
FreeImage
、
Devil
等,庫很強大且支援多種格式,當然也包括
DDS
紋理。例如
FreeImage
,但是它這裡所說的支援
DDS
格式是指將壓縮格式的資料重新解壓成
RGBA
畫素資料,將資料解壓後再繫結到
OpenGL
中就失去了其作為壓縮紋理的高效性(因
OpenGL
直接支援此壓縮紋理資料)。
FreeImage
作者建議參考
Ogre
的
DDS
紋理載入實現,但那部分實現與
Ogre
切合太緊不便
Ogre
之外應用,需要的是一個方便的壓縮紋理繫結函式。多方查詢後發現
Nvidia
的一個小類庫
nv_dds
挺好用的,就把它封裝了一下,附上原始碼
/** DDS 紋理繫結函式
* @param[in] filePath 紋理路徑
* @param[out] texID 紋理 ID
* @return 資料資訊
* - 0 開啟失敗
* - 1 RGB 格式
* - 2 RGBA 格式
*/
unsigned BuildDDS (char *filePath , unsigned &texID )
{
nv_dds ::CDDSImage image ;
if
(!image
{
return 0;
}
glGenTextures (1, &texID );
glEnable (GL_TEXTURE_2D );
glBindTexture (GL_TEXTURE_2D , texID );
glCompressedTexImage2D (GL_TEXTURE_2D , 0, image .get_format (),
image
.get_width
(), image
for (int i = 0; i < image .get_num_mipmaps (); i ++)
{
glCompressedTexImage2D (GL_TEXTURE_2D , i +1, image .get_format (),
image .get_mipmap (i ).get_width (), image .get_mipmap (i ).get_height (), 0,
image .get_mipmap (i ).get_size (), image .get_mipmap (i ));
}
return image .get_components () < 4 ? 1 : 2;
}
原始碼中使用到了 glext.h 標頭檔案、 glut 和 glew 兩個 OpenGL 相關庫,需自行新增到 VC2010 的相關目錄中,同時將 dds 紋理置於 C 盤或自行修改路徑。