青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆 - 5, 文章 - 0, 評論 - 24, 引用 - 0
數據加載中……

OpenGL中用FreeImage

FreeImage is an Open Source library project for developers who would like to support popular graphics image formats like PNG, BMP, JPEG, TIFF and others as needed by today's multimedia applications. FreeImage is easy to use, fast, multithreading safe, compatible with all 32-bit versions of Windows, and cross-platform (works both with Linux and Mac OS X).
測試過png,bmp,jpg,tga。

TextureManager.h
//**********************************************
//Singleton Texture Manager class
//Written by Ben English
//benjamin.english@oit.edu
//
//For use with OpenGL and the FreeImage library
//**********************************************

#ifndef TextureManager_H
#define TextureManager_H

#include 
<gl/glew.h>
#include 
"FreeImage.h"
#include 
<map>

class TextureManager
{
public:
    
static TextureManager* Inst();
    
virtual ~TextureManager();

    
//load a texture an make it the current texture
    
//if texID is already in use, it will be unloaded and replaced with this texture
    bool LoadTexture(const char* filename,    //where to load the file from
        const unsigned int texID,            //arbitrary id you will reference the texture by
                                            
//does not have to be generated with glGenTextures
        GLenum image_format = GL_RGB,        //format the image is in
        GLint internal_format = GL_RGB,        //format to store the image in
        GLint level = 0,                    //mipmapping level
        GLint border = 0);                    //border size

    
//free the memory for a texture
    bool UnloadTexture(const unsigned int texID);

    
//set the current texture
    bool BindTexture(const unsigned int texID);

    
//free all texture memory
    void UnloadAllTextures();

protected:
    TextureManager();
    TextureManager(
const TextureManager& tm);
    TextureManager
& operator=(const TextureManager& tm);

    
static TextureManager* m_inst;
    std::map
<unsigned int, GLuint> m_texID;
}
;

#endif

TextureManager.cpp
//**********************************************
//Singleton Texture Manager class
//Written by Ben English
//benjamin.english@oit.edu
//
//For use with OpenGL and the FreeImage library
//**********************************************

#include 
"TextureManager.h"

TextureManager
* TextureManager::m_inst(0);

TextureManager
* TextureManager::Inst()
{
    
if(!m_inst)
        m_inst 
= new TextureManager();

    
return m_inst;
}


TextureManager::TextureManager()
{
    
// call this ONLY when linking with FreeImage as a static library
    #ifdef FREEIMAGE_LIB
        FreeImage_Initialise();
    
#endif
}


//these should never be called
//TextureManager::TextureManager(const TextureManager& tm){}
//TextureManager& TextureManager::operator=(const TextureManager& tm){}
    
TextureManager::
~TextureManager()
{
    
// call this ONLY when linking with FreeImage as a static library
    #ifdef FREEIMAGE_LIB
        FreeImage_DeInitialise();
    
#endif

    UnloadAllTextures();
    m_inst 
= 0;
}


bool TextureManager::LoadTexture(const char* filename, const unsigned int texID, GLenum image_format, GLint internal_format, GLint level, GLint border)
{
    
//image format
    FREE_IMAGE_FORMAT fif = FIF_UNKNOWN;
    
//pointer to the image, once loaded
    FIBITMAP *dib(0);
    
//pointer to the image data
    BYTE* bits(0);
    
//image width and height
    unsigned int width(0), height(0);
    
//OpenGL's image ID to map to
    GLuint gl_texID;
    
    
//check the file signature and deduce its format
    fif = FreeImage_GetFileType(filename, 0);
    
//if still unknown, try to guess the file format from the file extension
    if(fif == FIF_UNKNOWN) 
        fif 
= FreeImage_GetFIFFromFilename(filename);
    
//if still unkown, return failure
    if(fif == FIF_UNKNOWN)
        
return false;

    
//check that the plugin has reading capabilities and load the file
    if(FreeImage_FIFSupportsReading(fif))
        dib 
= FreeImage_Load(fif, filename);
    
//if the image failed to load, return failure
    if(!dib)
        
return false;

    
//retrieve the image data
    bits = FreeImage_GetBits(dib);
    
//get the image width and height
    width = FreeImage_GetWidth(dib);
    height 
= FreeImage_GetHeight(dib);
    
//if this somehow one of these failed (they shouldn't), return failure
    if((bits == 0|| (width == 0|| (height == 0))
        
return false;
    
    
//if this texture ID is in use, unload the current texture
    if(m_texID.find(texID) != m_texID.end())
        glDeleteTextures(
1&(m_texID[texID]));

    
//generate an OpenGL texture ID for this texture
    glGenTextures(1&gl_texID);
    
//store the texture ID mapping
    m_texID[texID] = gl_texID;
    
//bind to the new texture ID
    glBindTexture(GL_TEXTURE_2D, gl_texID);
    
//store the texture data for OpenGL use
    glTexImage2D(GL_TEXTURE_2D, level, internal_format, width, height,
        border, image_format, GL_UNSIGNED_BYTE, bits);

    
//Free FreeImage's copy of the data
    FreeImage_Unload(dib);

    
//return success
    return true;
}


bool TextureManager::UnloadTexture(const unsigned int texID)
{
    
bool result(true);
    
//if this texture ID mapped, unload it's texture, and remove it from the map
    if(m_texID.find(texID) != m_texID.end())
    
{
        glDeleteTextures(
1&(m_texID[texID]));
        m_texID.erase(texID);
    }

    
//otherwise, unload failed
    else
    
{
        result 
= false;
    }


    
return result;
}


bool TextureManager::BindTexture(const unsigned int texID)
{
    
bool result(true);
    
//if this texture ID mapped, bind it's texture as current
    if(m_texID.find(texID) != m_texID.end())
        glBindTexture(GL_TEXTURE_2D, m_texID[texID]);
    
//otherwise, binding failed
    else
        result 
= false;

    
return result;
}


void TextureManager::UnloadAllTextures()
{
    
//start at the begginning of the texture map
    std::map<unsigned int, GLuint>::iterator i = m_texID.begin();

    
//Unload the textures untill the end of the texture map is found
    while(i != m_texID.end())
        UnloadTexture(i
->first);

    
//clear the texture map
    m_texID.clear();
}

Main.cpp
/************************************************************************/
/*Brief:  Test all kinds of Textures in OpenGL                          */
/*Author: tiny                                                          */
/*Date:   09/29/2008                                                    */
/************************************************************************/
#include 
"TextureManager.h"
#include 
<gl/glew.h>
#include 
<gl/glut.h>

//全局貼圖ID
GLuint texture[1];

void init()
{
    
//將2D貼圖狀態打開
    glEnable( GL_TEXTURE_2D );

    
//單件貼圖管理
    
//如果加載帶路徑的文件最好選用.\\這樣的格式
    TextureManager::Inst()->LoadTexture( "OpenGL_his.jpg", texture[0] );

    
//線性過濾一定要放到加載紋理的后面
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);    // 線性濾波
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);    // 線性濾波

    glClearColor( 
0.50.50.50.5 );
}


void display()
{
    glClear( GL_COLOR_BUFFER_BIT 
| GL_DEPTH_BUFFER_BIT );

    
//綁定紋理
    TextureManager::Inst()->BindTexture( texture[0] );

    
//渲染
    glBegin( GL_QUADS );
    glTexCoord2d( 
00 ); glVertex3f( -5.0f-5.0f0.0f );
    glTexCoord2d( 
01 ); glVertex3f( -5.0f5.0f0.0f );
    glTexCoord2d( 
11 ); glVertex3f( 5.0f5.0f0.0f );
    glTexCoord2d( 
10 ); glVertex3f( 5.0f-5.0f0.0f );
    glEnd();
    glFlush();

    glutSwapBuffers();
}


void reshape( int w, int h )
{
    glViewport( 
00, GLsizei( w ), GLsizei( h ) );
    glMatrixMode( GL_PROJECTION );
    glLoadIdentity();
    gluPerspective( 
45, ( GLdouble ) w / ( GLdouble ) h, 1.0f1000.0f );
    glMatrixMode( GL_MODELVIEW );
    glLoadIdentity();
    gluLookAt( 
0020000010 );
}


void keyboard( unsigned char key, int x, int y )
{
    
if ( key == 27 )
    
{
        
//釋放掉貼圖,防止內存泄露
        TextureManager::Inst()->UnloadTexture( texture[0] );
        exit( 
0 );
    }

        
}



int main( int argc, char *argv[] )
{
    glutInit( 
&argc, argv );
    glutInitDisplayMode( GLUT_DOUBLE 
| GLUT_RGBA | GLUT_DEPTH );
    glutInitWindowPosition( 
300300 );
    glutInitWindowSize( 
400300 );
    glutCreateWindow( 
"OpenGL Texture Test" );
    init();
    glutReshapeFunc( reshape );
    glutKeyboardFunc( keyboard );
    glutDisplayFunc( display );
    glutMainLoop();

    
return 0;
}
bmp效果圖:

tga效果圖:

jpg效果圖:

png效果圖:

有的圖的效果不是想要的,可能和RGB的順序有關。

posted on 2008-09-29 13:14 brilyf 閱讀(4384) 評論(5)  編輯 收藏 引用

評論

# re: OpenGL中用FreeImage  回復  更多評論   

不要意思,png和tga都是帶有alpha通道的,必須指定象素格式類型,如下:
TextureManager::Inst()->LoadTexture( "snowman.png", texture[0], GL_BGRA );
2008-09-29 13:48 | brilyf

# re: OpenGL中用FreeImage  回復  更多評論   

有人在嗎?究竟怎樣弄才能的到你這個效果呢?
2009-05-08 20:44 | hello opengl

# re: OpenGL中用FreeImage  回復  更多評論   

當我載入多個紋理時 只有1個有用...!!!!!!!!!!!
2012-01-27 11:15 | hrlqqq

# re: OpenGL中用FreeImage  回復  更多評論   

載入多個紋理時 只有一個有用...

代碼有問題??
2012-01-27 11:15 | hrlqqq

# re: OpenGL中用FreeImage  回復  更多評論   

是的,我也是驗證了很久,載入多個紋理時,只有最后載入的那個紋理才有用,前面的都無法使用。texture[i]沒有意義,無法通過使用texture[i]來bind指定的那個紋理
2012-05-17 12:27 | LHZorro
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            aaa亚洲精品一二三区| 好男人免费精品视频| 1769国产精品| 久久中文字幕一区二区三区| 亚洲欧美日韩另类| 国产乱肥老妇国产一区二| 亚洲一区二区成人| 亚洲一区观看| 国内精品久久久久久久影视蜜臀 | 亚洲日本一区二区三区| 亚洲欧美视频在线观看视频| 一区二区三区精品视频| 国产欧美一区二区精品秋霞影院| 国产美女一区| 裸体歌舞表演一区二区| 另类尿喷潮videofree| 99re6这里只有精品视频在线观看| 亚洲一区二区在线| 99国产精品久久久久久久久久 | 久久精品女人天堂| 久久婷婷麻豆| 亚洲网友自拍| 久久精品国产视频| 亚洲激情成人网| 在线一区二区三区四区五区| 国内精品免费午夜毛片| 91久久国产综合久久91精品网站| 亚洲一区二区三区激情| 国产女人18毛片水18精品| 男女精品网站| 国产精品对白刺激久久久| 免费欧美日韩国产三级电影| 国产精品v日韩精品| 免费欧美网站| 国产精品综合av一区二区国产馆| 中国女人久久久| 久久精品91久久久久久再现| 亚洲精品国产日韩| 欧美一级理论片| 中文精品99久久国产香蕉| 久久久蜜桃一区二区人| 亚洲自拍另类| 欧美精品三区| 欧美高清在线一区| 国产一区二区三区视频在线观看| 亚洲欧美中文另类| 欧美激情精品久久久久| 麻豆精品视频在线观看视频| 国产女精品视频网站免费| 日韩视频精品在线| 亚洲欧洲日本国产| 久久久国产一区二区三区| 欧美专区一区二区三区| 欧美天堂亚洲电影院在线播放 | 国产字幕视频一区二区| 亚洲美女区一区| 亚洲人在线视频| 老司机精品视频网站| 久久久欧美一区二区| 国产精品中文字幕欧美| 一区二区三区产品免费精品久久75| 欧美精品色网| 欧美韩国一区| 亚洲国产精品女人久久久| 久久狠狠婷婷| 免费久久99精品国产| 一区免费视频| 久久久综合网| 亚洲国产免费看| 亚洲人成网站影音先锋播放| 免费在线成人av| 亚洲国产日韩欧美一区二区三区| 欧美日韩美女一区二区| 91久久亚洲| 亚洲视频欧美在线| 欧美精品粉嫩高潮一区二区 | 国产麻豆精品久久一二三| 一区二区三区视频在线观看| 亚洲午夜日本在线观看| 欧美日本二区| 一区二区三区久久精品| 香蕉乱码成人久久天堂爱免费| 久久精品国产清高在天天线| 久久xxxx| 亚洲国产一二三| 欧美精品七区| 亚洲欧美日本视频在线观看| 久久不见久久见免费视频1| 国产欧美日韩免费| 欧美永久精品| 亚洲国产精品毛片| 亚洲视频一区在线| 激情综合视频| 欧美日本一区二区高清播放视频| 欧美影院精品一区| 激情文学综合丁香| 欧美1区2区视频| 欧美在线一区二区| 国产亚洲免费的视频看| 久久久久久久999精品视频| 欧美华人在线视频| 中文国产一区| 在线观看欧美日本| 欧美日韩国产一区二区三区地区| 久久福利资源站| 亚洲第一在线综合网站| 欧美日韩一级大片网址| 午夜精品久久久久久99热| 麻豆亚洲精品| 亚洲欧美清纯在线制服| 伊人成人在线| 国产精品免费观看视频| 麻豆91精品91久久久的内涵| 亚洲天堂男人| 亚洲成人在线视频网站| 欧美在线看片a免费观看| 亚洲精品日韩久久| 国产一区二区三区高清| 欧美日韩不卡一区| 久久人体大胆视频| 午夜精品久久一牛影视| 亚洲伦理一区| 亚洲高清不卡在线| 久久久久一区二区三区四区| 午夜精品视频| 在线视频精品一区| 亚洲人成7777| 在线播放国产一区中文字幕剧情欧美| 欧美一区二区久久久| 亚洲国产综合91精品麻豆| 久久精品国产第一区二区三区最新章节 | 一区二区久久| 好吊色欧美一区二区三区四区| 久久精品国产清自在天天线| 宅男精品视频| 99爱精品视频| 亚洲伦伦在线| 亚洲精品乱码久久久久久黑人| 99riav1国产精品视频| 一色屋精品视频在线观看网站| 久久婷婷综合激情| 亚洲欧美国产精品桃花 | 狠狠色丁香婷综合久久| 国产伦精品一区二区三区四区免费 | 亚洲欧美激情一区二区| 亚洲伦理中文字幕| 亚洲国产精品va在线看黑人| 在线精品观看| 影音先锋在线一区| 亚洲成人在线视频播放| 亚洲福利视频二区| 最新日韩在线| 9i看片成人免费高清| 在线亚洲成人| 亚洲欧美日韩视频一区| 欧美在线高清| 麻豆国产精品一区二区三区 | 99视频精品全国免费| 日韩午夜av电影| 一本色道久久综合亚洲91| 亚洲理论电影网| 亚洲女同性videos| 久久er精品视频| 女生裸体视频一区二区三区 | 国产精品日韩一区二区| 国产日韩免费| 在线看视频不卡| 亚洲电影免费观看高清| 亚洲经典在线看| 亚洲一区二区成人在线观看| 欧美一区二区视频在线| 欧美不卡激情三级在线观看| 亚洲激情综合| 亚洲免费综合| 久久性天堂网| 国产精品色婷婷| 精品69视频一区二区三区| 日韩视频一区二区三区| 香蕉成人久久| 欧美国产亚洲精品久久久8v| 日韩一区二区免费看| 欧美一区激情| 欧美人与禽性xxxxx杂性| 国产一区二区三区免费在线观看| 免费观看一区| 欧美日韩免费观看一区| 国产婷婷色一区二区三区四区| 玖玖视频精品| 国产精品入口夜色视频大尺度| 免费中文字幕日韩欧美| 欧美日韩精品免费观看视一区二区| 亚洲欧美国产77777| 噜噜噜噜噜久久久久久91| 国产精品另类一区| 91久久午夜| 午夜免费日韩视频| 亚洲国产天堂久久国产91| 性欧美在线看片a免费观看| 欧美久久久久免费| 激情久久一区|