Ich bin dabei, einige Teile einer Rendering-Engine zu refaktorieren, und frage mich, ob ein Shader wirklich wissen sollte, dass es OpenGL-Kontext ist. Gegenwärtig verfügt jeder Shader über eine bind() - und compileShader() -Methode, die nichts anderes tun, als den OpenGL-Kontext für die eigentliche Aufgabe aufzurufen.Software Architektur: OpenGL Shader erstellen und kompilieren
Es scheint üblich, diese Methoden im Shader implementiert zu haben - aber ist es wirklich eine gute Übung? Sollte es nicht besser sein, wenn der Kontext einen Shader erstellt, kompiliert und bindet? Und muss ein Shader unbedingt seinen Kontext kennen?
Einige Codefragmente unten. Hier sehen Sie, dass der Shader nur Kontextmethoden aufruft, und daher könnte die Kompilierung ein Anliegen des Kontextes sein und nicht der Shader selbst.
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);
}
Warum der Downvote? – benjist