2011-07-15 27 views
1

FC15上のC OpenGLプログラミングでは、EclipseとSDLのテクスチャに奇妙な問題があります。3Dテクスチャをロード:Linux上のSDL/OpenGL Eclipse

セットアップテスト目的のために、訥河のサンプルコードが使用されている:プログラムの実行 http://bigdaddysurf.com/blog/?p=21

を、我々は

$ make 
$ ./lesson07 

とコンソール上でそれを実行した場合のテクスチャをロードするには - それゆえ、すべての環境に必要なlibがインストールされ、Linux開発環境に存在します。しかし、IDE Eclipseで同じことをしようとすると、プログラムは実行されますが、テクスチャはロードされないので、テクスチャのない白いボックスしか見ることができません。

プロジェクト環境のセットアップには、などSDL、SDLmain、SDL_image、GL、GLU、などリンカーライブラリー(L)へのLIBS、持っている - 例えば:SDLと OpenGL and GLUT in Eclipse on OS X

プログラムの正常に動作しますキーボードなどで入力します。ただし、テクスチャは読み込まれません。私がすることが観察され、IDEのEclipse上で自動的に生成されたMakefileを読んで、そして、

CC = gcc -Wall -ansi 
all: 
$(CC) lesson07.c -o lesson07 -lGL -lGLU `sdl-config --cflags --libs` 

:Makefileで

は、コンソールのコマンドラインを実行に使用されること訥河から提供された、私は次の情報を気づきました明らかにこの追加のフラグはありません:sdl-config --cflags --libs。この追加のフラグは、コマンドSDL_LoadBMPがテクスチャを表示しないようにするものですか?

もしそうなら、生成されたIDE Makefileを正しく動作させるためにEclipseの設定に対してこの追加情報を適切に調整する方法に関するいくつかの提案がありますか?テクスチャがロードされている方法について

は、ここにある機能:

int LoadGLTextures() 
{ 
/* Status indicator */ 
int Status = FALSE; 

/* Create storage space for the texture */ 
SDL_Surface *TextureImage[1]; 

/* Load The Bitmap, Check For Errors, If Bitmap's Not Found Quit */ 
if ((TextureImage[0] = SDL_LoadBMP("data/crate.bmp"))) 
    { 

    /* Set the status to true */ 
    Status = TRUE; 

    /* Create The Texture */ 
    glGenTextures(3, &texture[0]); 

    /* Load in texture 1 */ 
    /* Typical Texture Generation Using Data From The Bitmap */ 
    glBindTexture(GL_TEXTURE_2D, texture[0]); 

    /* Generate The Texture */ 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->w, 
      TextureImage[0]->h, 0, GL_BGR, 
      GL_UNSIGNED_BYTE, TextureImage[0]->pixels); 

    /* Nearest Filtering */ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
      GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
      GL_NEAREST); 

    /* Load in texture 2 */ 
    /* Typical Texture Generation Using Data From The Bitmap */ 
    glBindTexture(GL_TEXTURE_2D, texture[1]); 

    /* Linear Filtering */ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
      GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
      GL_LINEAR); 

    /* Generate The Texture */ 
    glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->w, 
      TextureImage[0]->h, 0, GL_BGR, 
      GL_UNSIGNED_BYTE, TextureImage[0]->pixels); 

    /* Load in texture 3 */ 
    /* Typical Texture Generation Using Data From The Bitmap */ 
    glBindTexture(GL_TEXTURE_2D, texture[2]); 

    /* Mipmapped Filtering */ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
      GL_LINEAR_MIPMAP_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
      GL_LINEAR); 

    /* Generate The MipMapped Texture (NEW) */ 
    gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TextureImage[0]->w, 
       TextureImage[0]->h, GL_BGR, 
       GL_UNSIGNED_BYTE, TextureImage[0]->pixels); 
    } 

/* Free up any memory we may have used */ 
if (TextureImage[0]) 
    SDL_FreeSurface(TextureImage[0]); 

return Status; 
} 

すべてのコメントが高く評価されています。

答えて

3

テクスチャファイルへのパスはハードコーディングされていますか?それは現実的ですか?次に、相対パスが実際にテクスチャを評価するように、正しいディレクトリからプログラムを起動する必要があります。そうでなければファイルが見つからず、テクスチャがロードされません。

IDEは、コンパイルされたバイナリをビルドディレクトリにコンパイルして実行し、ハードコードされたファイルパスを破損する傾向があります。 Eclipseは単に正しい作業ディレクトリでプログラムを起動しません。 OSによっては、アプリケーションのバイナリの場所を検出するさまざまな方法があります。プログラムのバイナリの場所を特定する方法については、http://autopackage.org/docs/binrelocを参照してください。

+0

ご意見ありがとうございます。上記のイメージをロードする関数を参照してください。多分もっと良い見識を与えることができます。 "data/crate.bmp"私は以前にそれがうまくいくかどうかを確認するプロジェクト内のすべてのディレクトリに入れましたが、それはまだありませんでした。しかし、私もサブディレクトリなしでファイル "crate.bmp"を入れようとしましたが、これまでに働いていません。 – ThreaderSlash

+0

IDE Eclipseでは、デバッグして実行するように求められ、イメージは表示されません。しかし、Eclipseから生成された実行可能ファイルがあるフォルダに移動し、そのファイルをクリックすると、実行され、テクスチャが表示されます。その奇妙な行動。なぜ、どのようにこれを修正するヒント?前もって感謝します。 – ThreaderSlash

+0

ここで問題となるのは、プロジェクトのディレクトリツリーの周囲にテクスチャを散らばっていることは、直接的なアプローチではないということです。'char * buf;を追加してください。 puts(buf = getcwd(NULL、0));あなたのプログラムの始めに、起動時にどのディレクトリが作業ディレクトリであるかを見るためにfree(buf); – datenwolf

関連する問題