2016-10-09 11 views
-1

レンダリングエンジンの一部をリファクタリングしようとしています。シェーダがOpenGLコンテキストであることを本当に知っているかどうか疑問に思っています。現在、各シェーダはbind()とcompileShader()メソッドを持っています。これは、何もしませんが、実際のタスクのOpenGLコンテキストを呼び出します。ソフトウェアアーキテクチャ:OpenGLシェーダの作成とコンパイル

これらのメソッドをシェーダで実装するのは一般的ですが、実際には良い方法ですか?コンテキストを作成し、コンパイルしてシェイダーをバインドする方がよいでしょうか?シェーダは必然的にコンテキストを知る必要がありますか?

下記のコードは一部です。ここでは、シェーダがコンテキストメソッドを呼び出すだけであることが分かります。したがって、シェーダそのものではなく、コンテキストの関心事となる可能性があります。

ShaderPtr hdm::shader::fancy_lines_3d_ptr; 
fancy_lines_3d_ptr->compileShader(vert_src.c_str(), frag_src.c_str(), vlayout); 

void Shader::bind() 
{ 
    assert(_shaderObj); 
    _context.bindShader(_shaderObj); 
} 


void Shader::compileShader(const string &vertexSrc, 
          const string &fragmentSrc, 
          hdm::rendering::VERTEX_LAYOUT vlayout) 
{ 
    _context.compileShader(_shaderObj, vertexSrc.c_str(), vertexSrc.length(), SHADER_TYPE::ST_VERTEX); 
    _context.compileShader(_shaderObj, fragmentSrc.c_str(), fragmentSrc.length(), SHADER_TYPE::ST_FRAGMENT); 
    _context.bindAttributeLocations(vlayout, _shaderObj); 
    _context.linkShader(_shaderObj); 
} 
+0

なぜdownvote? – benjist

答えて

1

OpenGLとOOPプログラミングに関しては、明確な答えは与えられません。 OpenGL APIがグローバルな状態を混在させる方法や、単一のコンテキストに限定された特定のオブジェクト型や複数のコンテキスト間で共有可能な他のオブジェクト型のため、OpenGLをOOPモデルに完全にマッピングすることは非常に困難ではありません。

シェイダーを作成、コンパイル、バインドするコンテキストを持つ方がよいでしょうか?

はい!実際、OpenGLのコンテキストがOpenGLオブジェクトの場合はの工場であることは非常に意味があります。

シェーダは必然的にコンテキストを知る必要がありますか?

実際、すべてのOpenGLオブジェクトは関連するコンテキストを知る必要があります。専用の抽象コンテキスト参照クラスを使用して実装することをお勧めします。そのようなクラスから共有可能(画像、テクスチャであるオブジェクトによってインスタンス化されます共有可能でないオブジェクト(シェーダ、プログラム、フレームバッファオブジェクト、VAOs、...)と共有コンテキストの参照によってインスタンス化されますシングルコンテキスト参照を導き出します、バッファオブジェクトなど)。

そして、どういうわけか、コンテキスト共有設定を追跡し、これを共有コンテキスト参照にマップする方法を実装する必要があります。

関連する問題