OpenGL镶嵌回调未执行

OpenGL Tessellation Callback Not Executing

本文关键字:执行 回调 OpenGL      更新时间:2023-10-16

我使用这里的例子将我的镶嵌回调移动到一个不同的类。

代码可以编译,但是回调代码永远不会执行。

Callback类:

template <class Class, typename ReturnType, typename Parameter>
class SingularCallBack
{
public:
    typedef ReturnType (Class::*Method)(Parameter);
    SingularCallBack(Class* class_instance, Method method)
        : class_instance_(class_instance),
        method_(method)
    {}
    ReturnType operator()(Parameter parameter)
    {
        return (class_instance_->*method_)(parameter);
    }
    ReturnType execute(Parameter parameter)
    {
        return operator()(parameter);
    }
private:
    Class* class_instance_;
    Method method_;
};

回调:

void MyClass::tessBegin(GLenum which)
{
    glBegin(which);
    cout << "BEGIN CALLBACK IS WORKING";
}
void MyClass::tessVertex(const GLvoid *data)
{
    // cast back to double type
    const GLdouble *ptr = (const GLdouble*)data;
    glVertex3dv(ptr);
    cout << "VERTEX CALLBACK IS WORKING";
}

镶嵌函数,我在这里注册它们:

int MyClass::TessellatePolys()
{
    GLUtesselator *tess = gluNewTess(); // create a tessellator
    if(!tess) return 0;  // failed to create tessellation object, return 0
    // register callback functions
    SingularCallBack<GLOrtho, void, GLenum>*BeginCallback;
    BeginCallback = new SingularCallBack<GLOrtho, void, GLenum>(this,&GLOrtho::tessBegin);
    gluTessCallback(tess, GLU_TESS_BEGIN, (void (CALLBACK *)())BeginCallback);
    SingularCallBack<GLOrtho, void, const GLvoid*>*VertexCallback;
    VertexCallback = new SingularCallBack<GLOrtho, void, const GLvoid*>(this,&GLOrtho::tessVertex);
    gluTessCallback(tess, GLU_TESS_VERTEX, (void (CALLBACK *)())VertexCallback);
    ... (do tessellation) ...
    return id;
}

注册回调函数的方式有什么问题?

您正在将指向对象类型的指针转换为指向函数类型的指针(例如,"BeginCallback"转换为"void (CALLBACK *)()")。这些类型是不相容且不相关的。代码被编译为c风格的强制转换,没有任何类型检查。更重要的是,从c++编译器的角度来看,BeginCallback和VertexCallback是不同且不兼容的类型,函数gluTessCallback不能调用它们的重载操作符()——它们是不同的成员函数。