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

隨筆 - 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>
            亚洲片区在线| 午夜日韩视频| 欧美成在线视频| 99热在线精品观看| 日韩一区二区免费看| 国产精品v欧美精品v日韩 | 欧美一区二粉嫩精品国产一线天| 国产精品久久久91| 亚洲欧美综合精品久久成人| 亚洲一二三区在线| 狠狠入ady亚洲精品| 免费在线视频一区| 欧美精品成人| 亚洲欧美偷拍卡通变态| 欧美在线观看www| 最新国产成人在线观看| 一本久道久久久| 国语自产精品视频在线看8查询8| 麻豆国产精品va在线观看不卡 | 亚洲激情网站| 国产精品久久一级| 美国十次成人| 欧美午夜片欧美片在线观看| 久久国产加勒比精品无码| 久久裸体艺术| 亚洲视频精选在线| 欧美在线一级va免费观看| 亚洲精品久久久蜜桃| 亚洲午夜小视频| 亚洲国产精品久久久| 在线一区观看| 亚洲理伦电影| 久久九九电影| 亚洲男人的天堂在线观看| 久久嫩草精品久久久精品一| 亚洲永久视频| 欧美成人免费在线视频| 久久精品国产成人| 欧美日韩不卡在线| 久久综合久久综合久久综合| 欧美性淫爽ww久久久久无| 欧美3dxxxxhd| 国产日韩欧美日韩| 一本大道久久a久久精二百| 在线免费观看日韩欧美| 亚洲综合色在线| 中文网丁香综合网| 欧美成人午夜激情在线| 久久影院亚洲| 国产原创一区二区| 亚洲午夜免费福利视频| 国产精品99久久久久久宅男| 免费亚洲电影在线| 久久午夜视频| 国内一区二区三区在线视频| 亚洲无限乱码一二三四麻| 99国产成+人+综合+亚洲欧美| 久久成人这里只有精品| 欧美永久精品| 国产欧美一区二区三区沐欲| 亚洲视频免费| 亚洲制服av| 国产精品久久久对白| 亚洲开发第一视频在线播放| 91久久午夜| 欧美激情国产日韩| 亚洲人久久久| 国产精品99久久99久久久二8| 欧美黄色一级视频| 亚洲精品一区二区在线| 夜夜嗨av一区二区三区免费区 | 一本色道久久综合亚洲精品不卡| 亚洲精品久久久久久下一站| 免费欧美日韩| 亚洲国产天堂久久国产91| 亚洲美女黄色| 欧美日韩亚洲一区二区| 亚洲午夜精品网| 久久狠狠亚洲综合| 伊人成人在线视频| 免费的成人av| 99精品视频免费观看视频| 亚洲一区二区少妇| 国产精品自拍网站| 久久久国产精彩视频美女艺术照福利| 久久婷婷国产综合国色天香| 在线成人www免费观看视频| 欧美成人精品高清在线播放| 99精品国产福利在线观看免费| 亚洲一区二区日本| 国产亚洲一级| 欧美.www| 亚洲欧美综合v| 噜噜噜躁狠狠躁狠狠精品视频| 91久久久久久| 国产精品视频一区二区三区 | 亚洲日本欧美| 午夜精品一区二区三区在线播放| 国产日韩精品一区二区三区在线| 久久精品卡一| 日韩一级在线| 老司机免费视频久久| 9久re热视频在线精品| 国产精品伦一区| 免费观看成人| 午夜视频一区在线观看| 欧美激情精品久久久久久黑人| 中文在线不卡视频| 激情校园亚洲| 国产精品福利久久久| 久久天天躁狠狠躁夜夜av| 99天天综合性| 免费在线看一区| 午夜久久黄色| 亚洲免费激情| 狠狠色狠色综合曰曰| 国产精品99免视看9| 免费成人小视频| 欧美在线视频一区二区三区| 99av国产精品欲麻豆| 欧美国产日韩一区| 久久精品一区二区三区四区| 亚洲深夜福利网站| 亚洲精品在线看| 国产亚洲欧美激情| 国产精品成人观看视频免费| 欧美成人福利视频| 浪潮色综合久久天堂| 欧美影院久久久| 亚洲免费网站| 这里只有精品在线播放| 亚洲精品免费网站| 亚洲国产日韩在线| 欧美国产免费| 久久综合色播五月| 久久久久久久久久久久久久一区| 香蕉久久夜色精品国产使用方法 | 国产乱码精品一区二区三区av| 欧美精品 日韩| 欧美高清在线视频| 欧美jizz19hd性欧美| 久久偷窥视频| 老牛嫩草一区二区三区日本| 久久黄色影院| 久久九九国产精品| 久久久国产视频91| 久久久久久伊人| 久久久999国产| 久久精品五月| 美女性感视频久久久| 欧美成人免费全部| 欧美精品一区二区在线播放| 欧美v亚洲v综合ⅴ国产v| 美女福利精品视频| 免费影视亚洲| 欧美日韩大陆在线| 欧美午夜激情小视频| 久久精品免费观看| 久久av一区| 久久亚洲私人国产精品va媚药| 久久久久国产精品一区三寸| 久久网站免费| 欧美激情精品久久久| 亚洲三级视频在线观看| 一本一本久久a久久精品综合妖精| 一本久久a久久免费精品不卡| 亚洲自拍偷拍一区| 久久精品日产第一区二区三区| 久久影院午夜片一区| 欧美日韩黄视频| 国产麻豆精品视频| 在线日韩一区二区| 亚洲视频999| 久久精品官网| 亚洲激情午夜| 欧美亚洲一区二区在线| 免费欧美网站| 国产精品日韩一区二区| 在线观看成人小视频| 一区二区日韩免费看| 久久se精品一区精品二区| 欧美va天堂| 亚洲无限av看| 免费日韩成人| 国产欧美日韩91| 亚洲最快最全在线视频| 久久久亚洲精品一区二区三区| 亚洲国产精品一区二区第四页av | 欧美成人午夜影院| 国产精品制服诱惑| 日韩天堂av| 久久视频国产精品免费视频在线| 亚洲国产日韩欧美在线动漫 | 免费日韩成人| 亚洲午夜未删减在线观看| 麻豆久久婷婷| 国产午夜精品一区二区三区视频| 亚洲欧洲一区二区三区在线观看| 欧美一级在线视频| 亚洲九九爱视频|