2011-12-20 12 views
6

glGenTextures()を使用して、未使用のテクスチャIDを取得する代わりに。ランダムに番号を選択することはできますか、たとえば、99999とそれを使用しますか?ランダムなテクスチャIDを使用しても構いませんか?

私は、もちろん、クエリ:

glIsTexture(m_texture) 

、それは先に進む前に偽だことを確認してください。私はMac用の画像のスライドショーアプリを開発しています

はここにいくつかの背景です。スライドショーのプレビューは完璧です。スライドショーを保存するために、私はFBOにレンダリングしています。私はAGLコンテキストを作成し、glGenTextures()でテクスチャをインスタンス化し、フレームバッファにレンダリングします。マイナーな問題を除いて、すべてうまくいっている。

スライドショーを保存してメインウィンドウに戻ると、すべての画像サムネイルが灰色になります。つまり、テクスチャはクリアされています。

私はそれを調べて、画像サムネイルとFBOテクスチャが何とか同じテクスチャIDを持っていることを発見しました。スライドショーの保存操作の最後にFBOテクスチャを削除すると、サムネイルテクスチャも失われます。私は保存中にAGLコンテキストがあり、メインUIには別のAGLコンテキストがあります。これは、おそらくCore Imageによってバックグラウンドで作成され、制御できません。

だから私のオプション、私は今それを見るようにである:

  1. FBOテクスチャを削除しません。
  2. メインUIがそれを使用しないことを期待して、ランダムに高いテクスチャIDを選択してください。

実際に、私はあなたがAGL OpenGLコンテキストを削除する場合に必ずテクスチャを削除する必要はないと読んでいます。 OpenGLコンテキストを削除すると、関連するすべてのテクスチャが自動的に削除されるためです。これは本当ですか?はいの場合、オプション1が理にかなっています。

ここで起こっている面白い事が実際には説明できないことが分かります。たとえば、イメージスライドショーを.movファイルに保存した後、同じクラスで作成されたコンテキストを削除します。右にすると、別のコンテキストで作成されたテクスチャには影響しません。しかし、それは、私は真剣にそれを説明することはできません。

答えて

11

あなたの基本的な質問にまず答えることができます:はい、OpenGL 2.1の法律です。単純にテクスチャ名を任意に選択してテクスチャとして使用します。 3.2コアにはであり、ではないことに注意してください。 OpenGL ARBがこの機能を削除したことは、それが良いアイデアであるかどうかを示すのに役立ちます。

今、あなたは奇妙なバグに遭遇したようです。 glGenTexturesは、既に使用中のテクスチャ名を返すべきではありません。結局のところ、それは何のためです。何らかの形で既に使用中のテクスチャが表示されているように見えます。私はそれがどうなるかわかりません。

OpenGLコンテキストが破棄されると、そのコンテキストに固有のすべてのリソースが削除されます。最初のリソースとリソースを共有する2番目のコンテキストを作成した場合は、ではなくの共有リソース(テクスチャ、バッファなど)を削除します。共有されていないリソース(VAOなど)は削除されますが、それ以外のものはそのまま残ります。

FBOテクスチャを常に作成したり削除したりしないことをお勧めします。アプリケーションの起動時に作成するだけです。最悪の場合は、別のサイズや何かが必要な場合は、必要に応じて(glTexImage2Dを介して)オブジェクトのストレージを再割り当てする必要があります。

+0

あなたの答えに感謝します。 OpenGL 1.4を3.2に完全にサポートする必要があるので、手動でテクスチャIDを割り当てることは疑問ではありません。 私のベスト・ベットは、テクスチャをまったく削除しないことです。 Btw私はあなたの答えに投票することができません。十分なポイントがないので。 –

+0

@ニコル:あなたの2番目の段落はむしろ*不完全なようです*。 – genpfault

+0

@genpfault:修正されました。ありがとう! –

0

この問題が発生した場合は、コンテキストが完全に初期化されていることを確認してください。 glGenTexturesまでは常に0が返ってきます。最初は0が有効なテクスチャIDであると思われるので、何が起きているのか分かりませんでした。

関連する問題