web-dev-qa-db-ja.com

GLSLシェーダーを削除する適切な方法?

私のコードは、GLSLシェーダー管理にアプローチして、各シェーダーと関連プログラムを作成し、各シェーダーとプログラムを削除します。私は最近 http://www.opengl.org/wiki/GLSL_Object を読みました、そしてそこにはそれが述べられています:

シェーダーオブジェクトは、プログラムオブジェクトにアタッチされているため、シェーダーオブジェクトを削除しても引き続き存在します。システムによって削除されるのは、プログラムオブジェクトにアタッチされなくなったとき(もちろん、ユーザーが削除を要求したとき)だけです。

これは正しく取得できますか?プログラムにリンクした後にシェーダーオブジェクトでglDeleteShader()を呼び出した場合、プログラムを追跡するだけで済みますか?これが常に真実であると想定しても安全ですか?

50
rioki

はい-実際には、シェーダオブジェクトをできるだけ早くデタッチして削除することが強く望まれます。そうすることで、ドライバーはシェーダーソースとリンクされていないオブジェクトコードのコピーを保持するために使用しているすべてのメモリを解放できます。私が行った測定では、シェーダーオブジェクトを削除しないと、シェーダーあたりのメモリ使用量が5〜10倍増加することが示されています。

59
Chris Dodd

一般に、シェーダーオブジェクトの管理方法は簡単です。シェーダーオブジェクトは実際にはdo何もしないので、それらを追跡してもまったく意味がありません。シェーダーオブジェクトは、プログラムオブジェクトを正常にリンクするのに十分な時間だけ存在する必要があります。その後、シェーダーをプログラムから切り離して削除する必要があります。

上記はもちろん、シェーダーオブジェクトを使用して別のプログラムとリンクしようとしていないことを前提としています。それは確かに可能です。その場合は、すべてのプログラムをリンクした後、シェーダーオブジェクトを削除する必要があります。

13
Nicol Bolas

はい。その後、シェーダーを安全に削除できます。実際、メンテナンスが少ないため、これが推奨される方法です。何を削除するかを追跡する必要はありません。削除することを忘れないでください。そして、それはまだ機能します。

all OpenGLオブジェクトの場合と同様に、シェーダーを「削除」すると、フラグはフラグyo不要になると設定されます。 OpenGLは、それ自体が必要な限りそれを維持し、後で実際の削除を実行します(プログラムが削除された後の可能性が高いですが、必ずしもそうとは限りません)。

6
Damon

つまり、シェーダーごとにglLinkProgram()を呼び出してglDeleteShader()を呼び出し、削除するようにマークを付け、プログラムが不要になったときにglDeleteProgram()を呼び出します-この呼び出しは削除するだけではありませんプログラムだけでなく、それに接続されているすべてのシェーダーをデタッチして削除します(他のプログラムで使用されていない場合)。

したがって、通常はglDetachShader()を呼び出す必要はありません。 glDeleteProgram()のドキュメントを読んでください。

3
user1656730