4

私はしばらく疑問に思っていました.OpenGLオブジェクトの「名前」、glGenTexturesなどによって生成された整数は決してゼロにならないようです。そのため、ゼロを使用して初期化されていないハンドルを示し、エラーをチェックします。これまでのところ、問題ありません。

また、オブジェクトを使い終わった後に glBind*(0) を呼び出して、残っているバインドされたオブジェクトが後で誤って操作されないようにすることをお勧めします。賢明に聞こえます。

OpenGL オブジェクト ID がゼロになり、テストが無効になる状況はありますか? または、この方法でゼロを使用すると、非オブジェクトを参照しないために驚くべき効果が生じる場合がありますか?

PS zero-as-a-non-object の記号名はありますか?

PPS バインド/バインド解除パターンを多用すると、パフォーマンスが低下することはありますか? (カプセル化のために、ほとんどが冗長な再バインディングを持つコードの一部があります。)

4

5 に答える 5

2

テクスチャ名 0 は予約済みのテクスチャ名です。テクスチャを削除するたびに、テクスチャ名 0 にバインドされているかのようになります。この場合、常に使用される特別なテクスチャ名のようなものです。

glGenTextures()現在使用されていない名前のみを取得します。ゼロが使用されているため、有効な名前として取得することはできません。

ただし、glIsTextureon zero を使用すると false が返されるため、技術的にはテクスチャとして認識されないことに注意してください。

于 2013-08-12T18:01:52.427 に答える
1

OpenGL オブジェクト ID がゼロになり、テストが無効になる状況や、この方法でゼロを使用すると非オブジェクトを参照しないために驚くべき効果が生じる状況はありますか?

後でオブジェクト 0 をバインドしても、コードが無効になることはありません。驚くべき効果については、オブジェクト ゼロを実際に何にも使用しない限り、そのオブジェクトに対して操作を実行していない限り、問題ありません。

そうは言っても、オブジェクト ゼロが非オブジェクトではないすべての OpenGL オブジェクトの包括的なリストを以下に示します。

  • フレームバッファ オブジェクト。ゼロはデフォルトのフレームバッファであり、デフォルト以外のフレームバッファから非常に特別に扱われます。おそらく、ある時点でこのデフォルト オブジェクトを意図的に使用する必要があるでしょう ;)

  • 頂点配列オブジェクト。ただし、OpenGL との互換性のみ。コア プロファイルでは、VAO ゼロは有効なオブジェクトではありません。

  • GL-4.x より前の機能から継承されたフィードバック オブジェクトを変換します。

  • テクスチャ オブジェクト。これらのオブジェクトは、通常のテクスチャ オブジェクトとは非常に異なり、非常に奇妙で奇妙な動作をします。それらに意図的にデータを入れないでください。テクスチャのバインドを解除する場合にのみ使用してください。それがおそらくあなたが目にする最大の「驚くべき効果」です。

PPS バインド/バインド解除パターンを多用すると、パフォーマンスが低下することはありますか? (カプセル化のために、ほとんどが冗長な再バインディングを持つコードの一部があります。)

この使用パターンがパフォーマンスの問題を引き起こす可能性があります。しかし、レンダリング コードがそのようにカプセル化されている場合は、他の多くのパフォーマンスの問題が発生する可能性があります。たとえば、状態の変化に基づく並べ替えはかなり難しいはずです。

于 2015-12-01T04:57:43.517 に答える