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

隨筆 - 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 閱讀(4416) 評論(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

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美韩日一区二区| 久久国产福利国产秒拍| 在线精品国产成人综合| 亚洲欧美美女| 99v久久综合狠狠综合久久| 亚洲资源在线观看| 亚洲人成久久| 欧美激情一区二区三区全黄| 午夜伦欧美伦电影理论片| 欧美电影免费观看| 中文精品一区二区三区| 樱花yy私人影院亚洲| 欧美精品久久99| 亚洲自拍偷拍麻豆| 亚洲国产精品成人一区二区| 欧美在线在线| 亚洲视频1区| 日韩一级精品| 在线观看一区欧美| 国产亚洲欧美一区二区| 欧美激情精品久久久久久大尺度| 久久精品男女| 久久免费高清视频| 亚洲精品日韩在线| 欧美一级在线播放| 亚洲欧美不卡| 免费观看不卡av| 国产精品在线看| 亚洲三级电影在线观看| 午夜精品久久久久久久男人的天堂| 老司机成人网| 一区二区三区四区蜜桃| 玖玖玖国产精品| 国产欧美综合一区二区三区| 999在线观看精品免费不卡网站| 久久精品国产精品亚洲综合| 亚洲剧情一区二区| 久久久久国产精品午夜一区| 欧美小视频在线观看| 亚洲国产成人在线播放| 欧美在线你懂的| 日韩亚洲精品在线| 免费不卡在线视频| 国产一区二区三区久久久| 亚洲精品午夜精品| 亚洲风情亚aⅴ在线发布| 国产精品久久精品日日| 亚洲国产精品123| 久久爱www| 艳妇臀荡乳欲伦亚洲一区| 免费观看不卡av| 国产亚洲欧美激情| 亚洲男人第一av网站| 亚洲人成网站999久久久综合| 久久久午夜电影| 欧美在线视屏| 亚洲一区二区在线看| 日韩亚洲视频在线| 亚洲嫩草精品久久| 久久精品国产久精国产思思 | 一区二区三区免费在线观看| 国产精品99久久久久久久女警| 一区二区三区四区五区视频| 夜夜嗨一区二区三区| 久久只有精品| 欧美大片免费观看| 免费在线观看一区二区| 国产主播精品在线| 夜夜狂射影院欧美极品| 亚洲欧美精品在线观看| 亚洲毛片视频| 欧美精品亚洲精品| 亚洲美女毛片| 亚洲激情小视频| 欧美成人a视频| 91久久极品少妇xxxxⅹ软件| 蜜桃精品久久久久久久免费影院| 欧美成人蜜桃| 亚洲免费av网站| 欧美一区二区大片| 女女同性女同一区二区三区91| 欧美不卡高清| 国产精品理论片| 国产主播一区| 亚洲香蕉视频| 亚洲精品美女久久久久| 欧美成人国产| 国产精品一卡| 欧美一级午夜免费电影| 亚洲网站视频| 国产欧美精品国产国产专区| 欧美中文字幕| 久久精品国产综合精品| 伊人久久噜噜噜躁狠狠躁| 欧美sm视频| 欧美国产精品| 亚洲视频香蕉人妖| 亚洲女人小视频在线观看| 国产亚洲成av人在线观看导航| 麻豆精品一区二区综合av| 亚洲国产天堂久久国产91| 亚洲欧美日韩网| 欧美午夜精品一区二区三区| 在线成人亚洲| 另类尿喷潮videofree| 亚洲综合电影| 欧美日韩在线视频一区| 一本一本久久| 91久久精品一区二区别| 亚洲国产精品成人精品| 欧美日韩视频在线| 午夜一区二区三视频在线观看| 性欧美长视频| 亚洲国产成人在线播放| 亚洲理论在线| 国产麻豆综合| 欧美成人精精品一区二区频| 欧美精品一区二区三区久久久竹菊 | 国产日产精品一区二区三区四区的观看方式 | 久久久久久电影| 麻豆av一区二区三区久久| av成人免费在线| 亚洲免费在线播放| 在线免费观看一区二区三区| 亚洲人成人一区二区在线观看| 国产精品亚洲精品| 蜜桃久久av| 欧美视频网站| 久久天堂国产精品| 欧美日韩国内| 久久亚洲综合网| 欧美日韩精品欧美日韩精品 | 黄色成人在线| 亚洲精选一区二区| 国产综合久久久久久| 亚洲国产一区二区在线| 国产日产精品一区二区三区四区的观看方式 | 欧美激情精品久久久久久变态| 欧美三级在线播放| 老司机成人在线视频| 国产精品高潮呻吟久久| 蜜臀久久99精品久久久久久9| 欧美日韩精品福利| 免费影视亚洲| 国产精品入口66mio| 欧美激情91| 国产亚洲高清视频| 日韩网站在线| 亚洲国产片色| 性欧美暴力猛交69hd| 亚洲视频一起| 欧美成黄导航| 老司机67194精品线观看| 国产精品欧美经典| 亚洲精品国久久99热| 在线成人h网| 午夜精品电影| 亚洲一区三区电影在线观看| 你懂的亚洲视频| 久久久噜噜噜久久久| 国产精品久久7| 亚洲精品久久| 亚洲人成人99网站| 久久久久久自在自线| 欧美在线播放视频| 欧美肉体xxxx裸体137大胆| 亚洲二区在线| 亚洲第一毛片| 欧美在线1区| 欧美一区二区三区成人| 欧美三级在线播放| 亚洲精品在线观看免费| 亚洲国产综合视频在线观看| 久久不见久久见免费视频1| 欧美一级久久| 国产精品九色蝌蚪自拍| av成人免费观看| 99亚洲伊人久久精品影院红桃| 免费观看成人| 欧美韩日一区二区| 在线成人中文字幕| 久久婷婷久久一区二区三区| 久久久久久久久岛国免费| 国产精品一区二区三区四区五区| 一本大道久久a久久精品综合| 日韩一级免费| 欧美激情bt| 最新日韩在线| 日韩视频亚洲视频| 欧美激情 亚洲a∨综合| 亚洲级视频在线观看免费1级| 亚洲国产婷婷| 蜜月aⅴ免费一区二区三区| 欧美大片91| 亚洲电影免费在线| 麻豆精品视频在线观看视频| 你懂的视频一区二区| 在线看视频不卡| 你懂的视频一区二区| 91久久国产自产拍夜夜嗨|