2016-09-10 5 views
0

FreeImageライブラリでjpgイメージをロードしようとしました。私はこのコードを使用しましたが、結果は白い窓だけでした。私は背景のようにこのイメージを使用し、その後にオブジェクトファイルをロードすると思います。jpgイメージをテクスチャフリーイメージとしてロードする、opengl

#include <windows.h> 
#include <GL/glut.h> 
#include <iostream> 
#include <FreeImage.h> 

FIBITMAP *loadImage(const char *filename) 
{ 
    FIBITMAP *dib1 = NULL; 
    FREE_IMAGE_FORMAT fif = FreeImage_GetFIFFromFilename(filename); 

    dib1 = FreeImage_Load(fif, filename, JPEG_DEFAULT); 
    if (!dib1) 
    { 
     std::cerr << "Erreur ouverture d\'image" << std::endl; 
     exit (0); 

    } 
    std::cerr << "Success" << std::endl; 
    return dib1; 
} 

GLuint loadTexture (FIBITMAP * dib1) 
{ 
    GLuint tex_id = 0; 
    int x, y; 
    int height, width; 

    RGBQUAD rgbquad; 
    FREE_IMAGE_TYPE type; 
    BITMAPINFOHEADER *header; 

    type = FreeImage_GetImageType(dib1); 
    height = FreeImage_GetHeight(dib1); 
    width = FreeImage_GetWidth(dib1); 

    header = FreeImage_GetInfoHeader(dib1); 
    int scanLineWidh = ((3*width)%4 == 0) ? 3*width : ((3*width)/4)*4+4; 
    unsigned char * texels= (GLubyte*)calloc(height*scanLineWidh, sizeof(GLubyte)); 
    for (x=0 ; x<width ; x++) 
     for (y=0 ; y<height; y++) 
     { 
      FreeImage_GetPixelColor(dib1,x,y,&rgbquad); 

      texels[(y*scanLineWidh+3*x)]=((GLubyte*)&rgbquad)[2]; 
      texels[(y*scanLineWidh+3*x)+1]=((GLubyte*)&rgbquad)[1]; 
      texels[(y*scanLineWidh+3*x)+2]=((GLubyte*)&rgbquad)[0]; 
     } 

     glGenTextures (1, &tex_id); 
     glBindTexture (GL_TEXTURE_2D, tex_id); 

     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
     glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 


     glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, 
      width, height, 0, GL_RGB, 
      GL_UNSIGNED_BYTE, texels); 

     free(texels); 
     return tex_id; 
} 
void display(void) 
{ 
    glClearColor (0.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glutSwapBuffers(); //swap the buffers 

} 


int main(int argc, char **argv) { 

FIBITMAP *dib1 = loadImage("planina.jpg"); 

    glutInit(&argc,argv); 
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB|GLUT_DEPTH); 
    glutInitWindowSize(800,450); 
    glutInitWindowPosition(20,20); 
    glutCreateWindow("Loader"); 
    //glutReshapeFunc(reshape); 
    //glutDisplayFunc(display); 
    loadTexture(dib1); 
    FreeImage_Unload(dib1); 
    glutMainLoop(); 
    return 0; 
} 

を私が間違っているのは何:

は、私が使用していること、コードはそれ `s?

答えて

2

これはあなたの表示機能である:

void display(void) 
{ 
    glClearColor (0.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glLoadIdentity(); 
    glutSwapBuffers(); //swap the buffers 

} 

そして、何すぐに明らかにのはそれがない唯一のことは、

  • 透明な窓をクリアカラーを設定

    1. であること、です
    2. 単位行列をロードする
    3. は結果を表示します

    実際に何かを描いているものは何もありません。実際に何らかの形で現れるようにテクスチャに適用されたテクスチャで三角形や四角形を描く必要があります。

  • +1

    OPディスプレイコールバック、// glutDisplayFunc(ディスプレイ); – genpfault

    +0

    ありがとうございます。私はドットを表示しようとしましたが(ドットが表示されました)、画像は再び表示されませんでした。 –

    関連する問題