2013-08-29 6 views
6

これを行う適切な方法は何ですか?OpenGLプログラム/シェーダの初期化解除

私はこれらのステップをやってる:

  1. は、シェーダ(複数可)を作成します
  2. コンパイルシェーダ(S)
  3. プログラム
  4. の作成は
  5. Linkプログラムをプログラムする(S)シェーダを取り付け
  6. 削除シェーダ

http://www.opengl.org/wiki/GLSL_Objectそれは言う:プログラムをリンクした後でも、シェーダオブジェクトを明示的にデタッチする必要はありません。しかし、いったんリンクが完了すると、そうすることをお勧めします。そうしないと、プログラムオブジェクトは、それらを削除しようとすると、アタッチされたシェーダオブジェクトを有効に保ちます。

また、Proper way to delete GLSL shader?からは、シェーダを削除しないとメモリが増えてしまうとのことです。

http://www.opengl.org/sdk/docs/man/xhtml/glDetachShader.xmlをチェックすると、と表示されます。shaderがすでにglDeleteShaderの呼び出しによって削除のフラグが立てられていて、他のプログラムオブジェクトに接続されていない場合、そのオブジェクトは切り離された後に削除されます。

私の右手を外しておかないと、私の#6は役に立たないのですか?

プログラムを正しくコンパイルした後(メモリを節約するために)、デタッチして削除する必要がありますか、またはアプリケーションの終了時にのみデタッチ/削除する必要がありますか?

+0

sidenote: 'glBindAttribLocation'が有効になるように属性バインディングに加えられた変更に対して' glLinkProgram'を呼び出す必要があります。したがって、リンクされたプログラムからシェーダを削除して切り離すと、シェーダをシェーダに再バインドせずに属性バインディングを効果的に変更することはできません。 – PeterT

答えて

5

私の右手を切り離さないと、私の#6は役に立たないのですか?

はい。 GLは基本的に参照カウントです。他のオブジェクトがシェーダオブジェクトを参照している限り、それは存続します。オブジェクトを削除すると、実際の削除は最後の参照が削除されるまで延期されます。私 アプリケーションが閉鎖されたときに

私は切り離し、プログラムが正しく をコンパイルされた後に削除する必要があります(メモリを節約するために)または私は/のみ削除切り離す必要がありますか?

これはあなた次第です。あなたはもうそれを必要としなくなるとすぐに削除してください。そのシェーダを再リンクする予定がない場合は、最初のリンク操作の直後に、すべてのシェーダオブジェクトを破棄することができます。しかし、シェーダオブジェクトはあとで多くのメモリを消費することはなく(GPUメモリには移動せず、最終的なプログラムのみになります)、後でそれらを削除したり、それらを削除したりしなくても大したことはありませんすべてのGLリソースは、GLコンテキストが破棄されたときに破棄されます(アプリケーションが終了した場合も含めて)。もちろん、実行時に動的にシェーダを作成する場合は、古いオブジェクトや未使用のオブジェクトを動的に削除して、未使用のオブジェクトが多数蓄積されるのを避け、メモリ/オブジェクト名などを効果的にリークさせる必要があります。