レンダリングエンジンの一部をリファクタリングしようとしています。シェーダが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);
}
なぜdownvote? – benjist