У меня есть класс Shader
, в его конструкторе есть операторы для компиляции шейдера, связывания атрибутов и последующего связывания программы шейдера.Проблема в том, что я хотел бы, чтобы дочерний класс имел разные атрибуты, но это должно произойти до связывания.Виртуальные методы здесь не работают.Что мне делать?
Shader::Shader(const char* v, const char* f) {
program = glCreateProgram();
const char* vsrc = nullptr;
const char* fsrc = nullptr;
tls::readTextFile(std::ifstream(v, std::ios::binary), vsrc);
tls::readTextFile(std::ifstream(f, std::ios::binary), fsrc);
m_vertShader = compile(vsrc, GL_VERTEX_SHADER);
m_fragShader = compile(fsrc, GL_FRAGMENT_SHADER);
glAttachShader(program, m_vertShader);
glAttachShader(program, m_fragShader);
bindAttribs(); // it must happen before linking, in child class too.
glLinkProgram(program);
getUniforms();
setUniforms();
}
и дочерний класс:
void BasicShader::bindAttribs() {
bindAttribute(0, "pos");
bindAttribute(2, "vt");
} // this method is not called