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

隨筆 - 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>
            免费观看成人www动漫视频| 欧美一区2区视频在线观看| 欧美二区在线| 欧美一级午夜免费电影| 国产精品国产三级欧美二区| 亚洲一区二区网站| 久久久久久久精| 亚洲精品资源| 国产乱码精品一区二区三区忘忧草 | 樱桃国产成人精品视频| 欧美激情在线狂野欧美精品| 亚洲综合国产| 亚洲精品欧美一区二区三区| 欧美一区二区三区播放老司机| 午夜亚洲福利| 亚洲美洲欧洲综合国产一区| 亚洲视频在线观看| 亚洲欧洲日韩女同| 国产精品永久入口久久久| 国产欧美一区二区色老头| 欧美日韩午夜激情| 久久亚洲精品欧美| 欧美亚洲日本国产| 一区二区三区 在线观看视| 麻豆av一区二区三区| 亚洲免费在线视频| 99在线精品视频| 亚洲精品一二三| 影音先锋亚洲视频| 在线亚洲欧美| 一区二区三区国产在线观看| 欧美一区二区三区久久精品茉莉花| 老司机午夜免费精品视频| av72成人在线| 一个色综合av| 久久这里只精品最新地址| 久久久www免费人成黑人精品 | 日韩视频一区二区三区在线播放免费观看 | 国产精品九色蝌蚪自拍| 亚洲国产欧美一区| 亚洲精品日韩欧美| 久久久亚洲高清| 免费久久99精品国产| 久久久7777| 亚洲香蕉伊综合在人在线视看| 在线亚洲美日韩| 欧美一区二视频| 精品成人a区在线观看| 国产视频久久久久久久| 国产精品久久久久久久一区探花| 欧美激情一二三区| 伊人春色精品| 久久久久一本一区二区青青蜜月| 一本一道久久综合狠狠老精东影业 | 亚洲一二三区在线观看| 亚洲一区二区三区影院| 亚洲福利视频网站| 亚洲高清在线观看一区| 亚洲国产婷婷香蕉久久久久久| 国产情侣一区| 欧美大片在线看| 欧美影片第一页| 欧美一区二区精品久久911| 欧美日韩成人免费| 国产精品爱啪在线线免费观看 | 国产精品久99| 亚洲欧美日韩另类精品一区二区三区| 亚洲三级色网| 一区二区三区成人| 欧美日韩午夜在线| 国产精品99久久99久久久二8| 91久久国产精品91久久性色| 午夜精品美女久久久久av福利| 欧美自拍丝袜亚洲| 影音先锋久久久| 亚洲黄色有码视频| 欧美午夜电影网| 欧美亚洲一级| 久久久久久一区二区三区| 欧美日韩精品一本二本三本| 一本一本a久久| 亚洲欧美日韩人成在线播放| 在线观看欧美日韩国产| 最新亚洲激情| 国产亚洲成av人片在线观看桃| 久久综合成人精品亚洲另类欧美| 99国产精品一区| 国产精品亚洲精品| 亚洲一区二区三区中文字幕| 亚洲免费在线看| 亚洲电影一级黄| 久久成人一区二区| 亚洲午夜一区二区| 亚洲高清视频在线观看| 一本色道久久88综合亚洲精品ⅰ| 亚洲精品护士| 亚洲精品视频免费观看| 一区二区三区国产在线| 国产亚洲欧洲997久久综合| 夜色激情一区二区| 亚洲欧美日韩国产综合精品二区| 国产亚洲综合在线| 亚洲人成人77777线观看| 国产欧美日韩亚洲精品| 亚洲欧洲一区二区三区在线观看| 国产精品视频xxxx| 亚洲人成人一区二区在线观看| 国产一区二区精品久久99| 亚洲美女免费精品视频在线观看| 欧美激情亚洲国产| 久久乐国产精品| 国产精品久久久久久影视| 欧美成人午夜77777| 国产精品一区二区三区免费观看| 欧美国产视频在线| 久久免费的精品国产v∧| 在线一区免费观看| 老司机精品视频网站| 久久成人羞羞网站| 国产精品日韩一区二区三区| 亚洲精品在线视频观看| 亚洲黄色在线看| 久久久精品五月天| 久久九九久精品国产免费直播| 国产精品国产亚洲精品看不卡15| 亚洲国产欧美日韩精品| 欧美久久久久久蜜桃| 亚洲午夜精品一区二区| 欧美国产一区二区| 亚洲性线免费观看视频成熟| 蜜桃av一区二区三区| 亚洲精品视频免费| 欧美xx69| 欧美一级夜夜爽| 国产精品久久久一本精品| 亚洲毛片在线免费观看| aa日韩免费精品视频一| 欧美日韩极品在线观看一区| 91久久中文| 亚洲视频在线观看网站| 欧美性开放视频| 欧美一区二区女人| 国产精品女主播| 亚洲欧美美女| 久久久一区二区| 亚洲黄色免费网站| 欧美精品三区| 亚洲视频一区二区免费在线观看| 亚洲综合国产| 久久国产毛片| 亚洲精选一区二区| 免费在线亚洲欧美| 亚洲美女在线视频| 性欧美videos另类喷潮| 国产丝袜一区二区| 久久久中精品2020中文| 亚洲国产99| 亚洲欧美欧美一区二区三区| 国产日韩三区| 免费看精品久久片| 在线视频欧美日韩| 一区在线影院| 精品999网站| 欧美成人精品1314www| 亚洲精选视频在线| 欧美亚洲综合在线| ●精品国产综合乱码久久久久| 欧美h视频在线| 亚洲一区二区三区四区中文| 久久久www成人免费毛片麻豆 | 亚洲人成精品久久久久| 欧美日韩在线视频观看| 牛夜精品久久久久久久99黑人| 欧美日韩国产成人| 亚洲欧美日韩在线高清直播| 欧美激情精品久久久久久免费印度| 亚洲深夜福利网站| 136国产福利精品导航网址| 国产精品都在这里| 欧美成人一品| 久久九九久精品国产免费直播| 99国产精品| 欧美国产成人在线| 欧美一区二区三区视频在线观看| 亚洲黄页一区| 精品成人乱色一区二区| 国产精品久久久久影院色老大| 免费在线播放第一区高清av| 欧美一级理论性理论a| 一区二区三欧美| 亚洲精品久久7777| 欧美大秀在线观看| 久久久久国产精品一区| 亚洲自拍高清| 国产精品99久久久久久久vr| 亚洲精品久久视频| 亚洲国产精品一区在线观看不卡| 国产手机视频一区二区| 国产精品久久久久婷婷| 欧美色精品天天在线观看视频|