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

隨筆 - 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>
            国产欧美视频在线观看| 欧美日韩成人在线| 一区二区在线视频观看| 久久亚洲欧美| 久久男女视频| 亚洲美女免费视频| 一区二区日韩精品| 国产精品毛片在线| 久久久免费av| 欧美ed2k| 午夜精品久久久久久久白皮肤 | 免费视频一区| 蜜臀av性久久久久蜜臀aⅴ| 亚洲免费av片| 亚洲欧美中文日韩v在线观看| 国内久久婷婷综合| 91久久视频| 国产日韩欧美| 亚洲国产小视频在线观看| 国产精品久久久久久模特| 久久天天躁狠狠躁夜夜av| 欧美大片免费观看在线观看网站推荐| 亚洲视频你懂的| 久久久久久久欧美精品| 亚洲免费视频在线观看| 美女视频黄免费的久久| 亚洲欧美日韩综合国产aⅴ| 久久综合狠狠综合久久激情| 亚洲午夜视频在线观看| 久久精品av麻豆的观看方式| 亚洲图片欧美午夜| 美国十次成人| 久久精品视频99| 欧美日韩在线影院| 亚洲国产精品成人一区二区| 国产日韩欧美精品一区| 亚洲精选一区二区| 伊人成人在线视频| 亚洲欧美激情精品一区二区| 在线亚洲自拍| 欧美成人免费全部| 欧美不卡高清| 红桃av永久久久| 午夜老司机精品| 亚洲自拍电影| 欧美涩涩视频| 亚洲伦伦在线| 日韩一二在线观看| 美腿丝袜亚洲色图| 免费在线成人av| 狠狠做深爱婷婷久久综合一区 | 亚洲女女做受ⅹxx高潮| 一本色道久久88亚洲综合88| 久久人体大胆视频| 久久女同精品一区二区| 国产精品伊人日日| 亚洲午夜国产成人av电影男同| 亚洲免费成人av电影| 欧美+日本+国产+在线a∨观看| 免费一级欧美片在线播放| 韩日视频一区| 久久视频国产精品免费视频在线| 久久久久久**毛片大全| 国产在线播精品第三| 久久精品国产99国产精品| 久久精品视频在线看| 国产主播精品在线| 久久久精品动漫| 欧美1区免费| 亚洲人成高清| 欧美日韩精品福利| 亚洲综合日韩中文字幕v在线| 午夜免费日韩视频| 国产一区日韩一区| 麻豆国产精品777777在线| 欧美激情在线免费观看| 日韩亚洲欧美一区| 国产精品久久久| 小嫩嫩精品导航| 麻豆精品视频在线| 日韩午夜av电影| 欧美系列一区| 久久精品中文字幕免费mv| 欧美黑人多人双交| 亚洲一区二区三区中文字幕在线 | 国产精品福利网站| 欧美一区二区三区免费观看| 免费看的黄色欧美网站| 日韩天堂av| 国产精品一区免费视频| 久久影视精品| 一本色道综合亚洲| 美女性感视频久久久| 亚洲最新在线视频| 国产一区二区日韩| 欧美精选午夜久久久乱码6080| 中文精品在线| 欧美成人综合在线| 午夜精品视频一区| 亚洲国产一区二区视频| 欧美性感一类影片在线播放 | 亚洲欧洲精品一区| 久久激情五月丁香伊人| 日韩视频在线免费| 国产一区二区主播在线| 欧美日韩成人| 久久精品亚洲精品| 亚洲午夜电影| 亚洲高清自拍| 久久综合久久综合九色| 亚洲淫性视频| 亚洲精选成人| 在线欧美日韩精品| 国产日韩专区| 国产精品卡一卡二| 欧美精品久久99| 久久看片网站| 欧美一区二区三区免费视频| 亚洲精品视频一区二区三区| 欧美成人免费在线观看| 久久久久免费视频| 午夜精品久久久久久久99黑人| 日韩亚洲视频| 亚洲黄色av| 亚洲电影毛片| 精品盗摄一区二区三区| 国产一区二区三区高清播放| 国产精品国产三级国产专播品爱网| 男人的天堂亚洲| 麻豆精品视频在线观看| 久久久91精品| 久久国产精品99久久久久久老狼| 亚洲字幕一区二区| 亚洲无线一线二线三线区别av| 日韩午夜电影av| 亚洲人成人一区二区在线观看| 欧美国产日韩一区| 欧美国产先锋| 亚洲国产精品一区在线观看不卡 | 亚洲视频大全| 一本色道久久88亚洲综合88| 亚洲美女在线看| 99精品福利视频| 99re6热只有精品免费观看| 日韩一级大片在线| 9i看片成人免费高清| 亚洲理论在线| 亚洲午夜精品国产| 午夜精品久久久久影视 | 亚洲一区二区精品视频| 亚洲一区在线看| 欧美一区二区三区喷汁尤物| 小黄鸭精品密入口导航| 久久经典综合| 美女日韩在线中文字幕| 欧美激情第一页xxx| 欧美黄色免费| av不卡免费看| 亚洲欧美日韩成人| 久久精品首页| 欧美另类女人| 国产精品制服诱惑| 在线观看欧美视频| 日韩亚洲在线| 久久都是精品| 亚洲国产精品黑人久久久| 99国产精品国产精品毛片| 亚洲欧美激情四射在线日| 久久久久九九九九| 欧美精品一级| 国产区亚洲区欧美区| 亚洲国产综合视频在线观看| 亚洲天天影视| 久热精品视频| 一区二区三区日韩欧美| 久久国产视频网| 亚洲四色影视在线观看| 久久一二三区| 日韩视频不卡| 久久精品国产精品亚洲| 欧美日韩不卡一区| 一区精品在线播放| 亚洲影视在线| 欧美成人综合| 午夜精品免费视频| 欧美噜噜久久久xxx| 国模大胆一区二区三区| 亚洲一区二区欧美| 欧美激情偷拍| 久久av红桃一区二区小说| 欧美日韩国产三区| 99精品国产福利在线观看免费 | 欧美va亚洲va日韩∨a综合色| 国产精品福利在线观看网址| 亚洲风情在线资源站| 欧美中在线观看| 一区二区久久久久| 欧美超级免费视 在线| 激情久久久久久| 欧美一级专区免费大片|