glLinkProgramが成功した後、シェーダーを削除/デタッチする必要がありますか?


45

リンクされたプログラムがあり、防御的なプログラミングについて考えた後、このプログラムをリンクするために使用されたシェーダーを削除して切り離す必要がありますか?

「はい」の場合、リソースを解放しますか?または、これらのシェーダーオブジェクトはglDeleteProgram呼び出しの後にのみ解放されますか?

編集:ちょうど私がやっていることを明確にするためです(答えと一致しています):

glCreateShader-> glShaderSource-> glCompileShader-> glCreateProgram-> glAttachShader-> glLinkProgram-> glDetachShader-> glDeleteShader->このシェーダープログラムを使用して描画->このシェーダーが不要になったときglDeleteProgram

回答:


46

はい、常にこれを行う必要があります。つい最近までこのことを知りませんでしたが、シェーダーは実際にはglDeleteShader切り離されるまで削除されません。次のマニュアルページに記載されていますglDetachShader

編集:シェーダーの削除についても少し見落としていました。はい、シェーダーソースとリンクされていないオブジェクトコードを保存するために使用されるメモリを解放するため、これを行う必要があります。これについては、このStackOverflowの質問で詳しく説明しています。


+1し、追跡およびglDeleteするオブジェクトが1つしかないため、クリーンアップも容易になります。
マキシマスミニマス

2

順序は正しいですが、シェーダーをアタッチ解除する必要はありません。glDeleteProgramを呼び出すと、すべてのアタッチされたシェーダーで自動的に削除され、その後自動的に削除されます(glDeleteShader funcで削除フラグが設定されている場合)。

参考:http://www.opengl.org/sdk/docs/man/xhtml/glDeleteProgram.xml


シェーダーオブジェクトは、各プログラムに比べて多くのメモリを消費します。プログラムのコンパイルが完了し、より重要なことに使用できるメモリを増やしたら、それらを削除することをお勧めします。
ロバートRouhani
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.