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

隨筆 - 5, 文章 - 0, 評(píng)論 - 24, 引用 - 0
數(shù)據(jù)加載中……

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).
測(cè)試過(guò)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貼圖狀態(tài)打開(kāi)
    glEnable( GL_TEXTURE_2D );

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

    
//線性過(guò)濾一定要放到加載紋理的后面
    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 )
    
{
        
//釋放掉貼圖,防止內(nèi)存泄露
        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的順序有關(guān)。

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

評(píng)論

# re: OpenGL中用FreeImage  回復(fù)  更多評(píng)論   

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

# re: OpenGL中用FreeImage  回復(fù)  更多評(píng)論   

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

# re: OpenGL中用FreeImage  回復(fù)  更多評(píng)論   

當(dāng)我載入多個(gè)紋理時(shí) 只有1個(gè)有用...!!!!!!!!!!!
2012-01-27 11:15 | hrlqqq

# re: OpenGL中用FreeImage  回復(fù)  更多評(píng)論   

載入多個(gè)紋理時(shí) 只有一個(gè)有用...

代碼有問(wèn)題??
2012-01-27 11:15 | hrlqqq

# re: OpenGL中用FreeImage  回復(fù)  更多評(píng)論   

是的,我也是驗(yàn)證了很久,載入多個(gè)紋理時(shí),只有最后載入的那個(gè)紋理才有用,前面的都無(wú)法使用。texture[i]沒(méi)有意義,無(wú)法通過(guò)使用texture[i]來(lái)bind指定的那個(gè)紋理
2012-05-17 12:27 | LHZorro

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   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>
            久久久久国产精品厨房| 欧美伊人久久大香线蕉综合69| 性久久久久久久久| 亚洲午夜精品网| 亚洲性图久久| 亚洲欧美日韩成人| 欧美一区二区三区婷婷月色| 久久精品国产综合| 久久尤物视频| 欧美福利在线观看| 亚洲人久久久| 亚洲成色777777在线观看影院| 欧美国产精品v| 亚洲人成在线影院| 亚洲一级在线观看| 欧美一区综合| 麻豆国产精品va在线观看不卡| 欧美成人免费小视频| 欧美日韩一区精品| 国产欧美日韩91| 在线观看日产精品| 日韩午夜av| 香蕉久久夜色精品| 老司机免费视频久久| 亚洲国语精品自产拍在线观看| 亚洲伦理一区| 亚洲欧美在线高清| 久久人人九九| 欧美日韩久久精品| 国产欧美日韩精品a在线观看| 一区二区三区在线高清| 亚洲精品乱码久久久久久日本蜜臀| 在线一区二区三区做爰视频网站| 欧美在线观看视频在线| 欧美成人午夜激情视频| 99精品视频免费全部在线| 欧美一区二区福利在线| 欧美a级片网| 国产精品美女主播| 亚洲国产精品一区二区三区| 欧美午夜精品久久久久久久| 国产日韩亚洲欧美精品| 亚洲青涩在线| 欧美在线视频一区二区| 亚洲成在人线av| 亚洲在线第一页| 欧美福利电影在线观看| 国产精品自拍三区| 99v久久综合狠狠综合久久| 欧美一区二区三区四区视频 | 午夜精品视频| 亚洲精选成人| 欧美一级大片在线观看| 欧美1区2区| 亚洲一区二区三区乱码aⅴ| 裸体一区二区三区| 国产精品揄拍500视频| 最新日韩欧美| 久久久久久久久蜜桃| 99国产精品久久| 久久久久久伊人| 国产精品美女久久久| 亚洲精品综合精品自拍| 久久美女性网| 亚洲素人在线| 欧美极品在线播放| 激情欧美一区| 欧美影院视频| 一区二区三区 在线观看视| 免费高清在线视频一区·| 国产欧美一区二区精品婷婷| 亚洲午夜精品久久久久久浪潮| 欧美成人精品h版在线观看| 性色av香蕉一区二区| 欧美三级日本三级少妇99| 亚洲精品日韩欧美| 免费视频一区| 久久aⅴ国产欧美74aaa| 国产美女一区| 亚洲一区二区精品在线| 亚洲日本中文字幕| 欧美+亚洲+精品+三区| 伊人婷婷欧美激情| 久久疯狂做爰流白浆xx| 在线性视频日韩欧美| 欧美精品二区三区四区免费看视频| 激情文学一区| 久久嫩草精品久久久久| 午夜一级在线看亚洲| 国产精品一区二区久久精品| 亚洲视频欧美在线| 亚洲另类在线视频| 欧美精品在线一区二区三区| 亚洲人人精品| 亚洲高清视频一区| 欧美aaa级| 亚洲精品乱码久久久久| 亚洲国产精品成人综合色在线婷婷| 久久亚洲一区二区| 1024亚洲| 欧美高清视频一区二区三区在线观看 | 午夜精品理论片| 国产精品三上| 欧美一区二区三区另类| 亚洲天堂av在线免费| 国产精品久久一卡二卡| 亚洲欧美国内爽妇网| 亚洲午夜视频在线观看| 国产精品永久免费观看| 久久aⅴ国产欧美74aaa| 欧美亚洲三区| 黄色影院成人| 欧美国产一区二区| 免费看av成人| 99伊人成综合| 一区二区免费在线视频| 国产精品视屏| 久久女同精品一区二区| 久久久久综合网| 亚洲黄一区二区| 亚洲精品国产无天堂网2021| 欧美日韩免费一区| 亚洲欧美一区二区三区极速播放 | 国产精品尤物| 久久久久女教师免费一区| 久久久www成人免费毛片麻豆| 尤物九九久久国产精品的特点| 欧美大成色www永久网站婷| 欧美风情在线观看| 亚洲午夜电影| 亚洲欧美日韩精品一区二区| 国精产品99永久一区一区| 欧美xxx成人| 欧美激情综合五月色丁香| 亚洲女女女同性video| 香蕉亚洲视频| 亚洲电影在线| 国产婷婷一区二区| 亚洲小说欧美另类婷婷| 亚洲一区综合| 狠狠入ady亚洲精品| 欧美激情综合| 欧美色另类天堂2015| 欧美在线亚洲| 久久综合图片| 亚洲午夜精品17c| 欧美一区二区三区视频免费| 亚洲精华国产欧美| 亚洲婷婷免费| 亚洲国产精品999| 夜夜嗨av一区二区三区网站四季av| 国产欧美在线观看| 欧美激情精品久久久久久黑人| 欧美午夜www高清视频| 久久蜜臀精品av| 欧美精品一区二区三区在线看午夜| 国产日韩欧美另类| 欧美成人综合一区| 国产精品男人爽免费视频1| 老妇喷水一区二区三区| 欧美日韩免费一区二区三区视频| 久久精品一区四区| 欧美国产成人在线| 久久精品动漫| 欧美精品国产一区| 久久久久久久性| 欧美精品一区二区三区四区| 欧美专区日韩专区| 欧美日韩p片| 麻豆9191精品国产| 国产精品欧美经典| 亚洲国产日韩一区二区| 国产婷婷色一区二区三区在线 | 久久精品一二三| 亚洲视频中文字幕| 久久天天狠狠| 欧美一区视频| 蜜臀a∨国产成人精品| 亚洲欧美视频在线观看视频| 欧美成人午夜视频| 久久精品天堂| 欧美三级资源在线| 欧美黑人在线观看| 国产一区二区欧美| 中文国产成人精品| 日韩视频在线一区二区| 久久精品人人做人人爽电影蜜月| 亚洲一区不卡| 欧美日韩成人综合在线一区二区| 久色成人在线| 国产女主播视频一区二区| 亚洲巨乳在线| 亚洲国产精品毛片| 久久福利资源站| 亚洲欧美久久久久一区二区三区| 免费观看久久久4p| 久久亚洲欧美| 国产欧美日韩中文字幕在线| 99re6热只有精品免费观看 | 亚洲国产精品一区二区www|