Я собираюсь реорганизовать некоторые части механизма рендеринга и задаюсь вопросом, должен ли шейдер действительно знать, что это контекст OpenGL. В настоящее время каждый шейдер имеет метод bind() и compileShader(), который ничего не делает, кроме вызова контекста OpenGL для реальной задачи.Архитектура программного обеспечения: создание и компиляция OpenGL Shader
Похоже, что эти методы реализованы в шейдере - но действительно ли это хорошая практика? Не лучше ли создавать контекст, компилировать и связывать шейдер? И обязательно ли шейдер должен знать, что это контекст?
Некоторые фрагменты кода ниже. Здесь вы видите, что шейдер просто вызывает контекстные методы, поэтому компиляция может быть проблемой контекста, а не самого шейдера.
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);
}
Почему нижний предел? – benjist