これがシナリオです。Program という名前のクラスがあり、頂点、ジオメトリ、フラグメント シェーダーの 3 つの shared_ptr を保持しています。Shader オブジェクトが構築されると、glCreateShader でシェーダーが作成され、コンパイルも行われます。
Shader デンストラクタは自動的に glDeleteShader を呼び出します。したがって、問題は、次のことを行う場合です。
- シェーダー オブジェクトを作成します。
- コピーします。
- コピーを破棄します。
また、コピーが破棄されると glDeleteShader が呼び出されるため、元のコピーも無効になります。それは設計上の問題だと思います。
そのため、ポインターを使用するだけでこの問題を回避しました。これで、Program クラスがシェーダーを保持します。頂点、ジオメトリ、およびフラグメント シェーダー オブジェクトに shared_ptr を返すメソッドを作成しました。私の疑問は、次のように shared_ptr を返す必要があるかどうかです。
const shared_ptr<Shader>& getVertex_shader_ptr() const
{
return vertex_shader_ptr;
}
またはこのように:
shared_ptr<Shader> getVertex_shader_ptr() const
{
return vertex_shader_ptr;
}
私が恐れているのは、上で説明した問題が再び発生することです。shared_ptr の割り当てが解除され、OpenGL シェーダーが無効になります。