我试图在程序中使用基本着色器进行加载,但是在加载后,我得到了“未处理的异常”弹出框。我创建了一个基类来完成加载通用着色器的所有常见部分。在基类中,我有一个受保护的虚函数和公共函数来处理OpenGL属性。以下是发生情况的两个基本示例:
class ShaderProgram // Base class
{
public:
...
protected:
void bindAttribute(GLuint attribNumber, const char* variableName);
virtual void bindAttributes() = 0; // needed for different shaders
private:
GLuint programID;
void loadShaders(const char* vertFile, const char* fragFile);
}
class BasicShader : public ShaderProgram // derived class
{
public:
...
protected:
void bindAttributes() { bindAttribute(0, "position"); }
...
}
现在在loadShaders()
:
programID = glCreateProgram();
glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragmentShaderID);
glLinkProgram(programID);
bindAttributes(); // Unhandled Exception pointing here
尝试运行该错误时,出现此错误。但如果我取代bindAttributes()
与glBindAttribLocation(programID, 0, "position")
被称为内bindAttribute()
,程序运行,因为它应该。关于什么导致此错误的任何想法?
我看到这loadShaders()
是私人的ShaderProgram
。根据您描述的症状和解决方法,我怀疑您可以从类的构造函数中调用它。
如果是这种情况,则是由于在构造过程中使用了纯虚函数。更具体地说,BasicShader
从基础派生的类的构建过程ShaderProgram
如下所示:
ShaderProgram
构造类的基础对象。目前,该对象仅为ShaderProgramm
。您可以在其构造函数中调用的虚函数仍然是基类中定义的虚函数。BasicShader
才会生效。因此,如果您loadShaders()
从的构造函数进行调用ShaderProgramm
,它将最终尝试立即调用bindAttributes()
它,但它仍然是纯虚函数(即,未定义)。
标准10.4 / 6:成员函数可以从抽象类的构造函数(或析构函数)中调用;对于从这样的构造函数(或析构函数)创建(或销毁)的对象直接或间接对纯虚函数进行虚拟调用的效果是不确定的。
有两种解决方案:
loadShaders()
是BasicShader
从而不是从的构造函数调用的ShaderProgram
。这要求您将功能设置为受保护的,而不是私有的。如果我的假设是错误的,并且您没有loadShaders()
从构造函数中调用,请在您调用它的位置发布代码以及对其参数进行初始化,然后我将更新答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句