2012-02-22 12 views
0

私は2Dゲームプロジェクトに取り組んでいます。私はopenGlテクスチャを単純なクラスにラップしたいと思っていました。テクスチャはlibpngを使用して128x128px .p​​ng(アルファチャンネル)から読み込まれます。コードの量がかなり大きいので、私はpastebinを使用しています。OpenGL 2Dテクスチャが動作しない

コードファイル:

  • テクスチャクラス:http://pastebin.com/gbGMEF2Z
  • PngReaderクラス:http://pastebin.com/h6uP5Uc8は(大丈夫動作しているようですので、私は説明を削除しました)。
  • OpenGLのコード:

    あなたの時間を無駄にしないように、私はコードを少し説明します。 loadData関数はglでテクスチャを設定します(これは私が動作しないと思われる関数です)。

  • OpenGLのコードdebugSetTexture関数はgraphicsDraw()関数で使用されるtemp変数にテクスチャを置きます。これは、同じソースファイル内にmain()としていないためです。 graphicsMainLoop()関数では、実際にはfork()を呼び出し、生成されたプロセスのpidを格納するFork()関数を使用します。 main()から

、これは私が何をすべきかです:

Strategy::IO::PngReader reader ("/cygdrive/c/Users/Tibi/Desktop/128x128.png"); 
reader.read(); 
grahpicsInit2D(&argc, argv); 
debugSetTexture(reader.generateTexture()); 
graphicsMainLoop(); 
reader.close(); 

私は、アプリケーションを試してみましたgDEBuggerと呼ばれ、テクスチャビューアで、生成されたテクスチャがありましたが、サイズは0x0pxました。

Texture :: loadTexture()を使用してテクスチャが読み込まれたときに問題が発生したと思われます。

+0

なぜCygwinを使用していますか? Cygwin環境でプログラムを実行しますか? – AndiDog

+0

"Texture :: loadData()関数が機能しないと思われます" ...そういうわけで、Textureクラス以外の最小限の例では、同じデータに対して同じことを試みましたか?それは動作しますか? – Bart

+0

@AndiDog Eclipseが設定されている方法です...私はmingwをインストールしていないので、Windowsにlibpngが存在するかどうかわかりません。 – Tibi

答えて

1

GL呼び出し後にGLエラーコードをチェックする必要があります。例えば

は、あなたのクラスにこのメソッドを追加します。

GLuint Texture::checkError(const char *context) 
{ 
    GLuint err = glGetError(); 
    if (err > 0) { 
    std::cout << "0x" << std::hex << err << " glGetError() in " << context 
    << std::endl; 
    } 
    return err; 
} 

をそのようにようにそれを呼び出す:

glBindTexture(GL_TEXTURE_2D, handle); 
checkError("glBindTexture"); 

は、PNGファイルをロードすることに成功したと仮定すると、あなたのプログラムがglBindTextureに失敗したと? (強いヒント)

あなたのファイル処理のためにエラー関数を呼び出しましたが、あなたのプログラムは停止してしまいましたか?

ここで深刻な問題があります。テクスチャPngReader :: generateTexture()は値でテクスチャを返します。これにより、Textureオブジェクトがリターン(ハンドルおよびすべて)でコピーされ、次に〜Texture()が呼び出され、スタックベースのコピーが破棄されます。だからあなたのプログラムはglDeleteTexturesを数回呼び出すでしょう!

値で返す場合は、参照カウントを行うshared_ptr <>に値を返すことができます。これにより、デストラクタは一度だけ呼び出されます。

#include <tr1/memory> 
typedef std::tr1::shared_ptr<Texture> TexturePtr; 

戻り値の型としてTexturePtrを使用します。このようなgenerateTexture()でそれを初期化します。

TexturePtr t(new Texture); 

は、通過するすべてのメソッドへのアクセスを変更 - >の代わりに。

+0

エラーがある場合はエラー機能がログファイルに出力することを忘れています。それだけです。エラーは表示されません。私はまたmemsetを使ってメモリに画像を生成しようとしましたが、うまくいきませんでした。私は今glGetErrorしようとしています。 – Tibi

+0

いいえ、何も...私は何かエラーが発生しません。 – Tibi

+0

ありがとう、これは問題でした...デストラクタが呼び出され、問題を引き起こしていました。 – Tibi

関連する問題