【发布时间】:2018-12-26 17:59:08
【问题描述】:
我有一个类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
【问题讨论】:
-
重新打开。问题是不是为什么虚函数没有按照人们预期的方式运行,这就是所谓的重复所解决的问题。问题是该怎么做。并不是说有一个很好的答案......
-
@Pete “并不是说有一个好的答案……” 没错。我可以想到一个 Factory Pattern。
标签: c++ function shader virtual