首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从OpenGL传递Qt4上下文?

如何从OpenGL传递Qt4上下文?
EN

Stack Overflow用户
提问于 2011-12-04 02:28:04
回答 1查看 1.2K关注 0票数 1

我目前正在LeadWerks 2引擎中开发一个游戏,我决定使用Qt4作为GUI和窗口管理器。我想要做的是创建一个Qt QGLWidget窗口,并在其中运行LeadWerks引擎。有一些关于构建基本QGLWidget应用程序这里的信息。

我真的很难理解如何做到这一点。我可以在LeadWerks引擎中创建一个自定义GL缓冲区,我相信我需要做的是给这个缓冲区创建GL上下文Qt。至于事物的LeadWerks方面,我需要做的主要事情是调用一个名为CreateCustomBuffer的方法,并传递一些东西:

虚拟空缓冲区::CreateCustom(字节* getsize,字节* makecurrent)

创建并返回新的自定义缓冲区。GetSize (定义为void _stdcall GetSize(int* _stdcall GetSize,int* GetSize))和MakeCurrent (定义为void _stdcall MakeCurrent(void))是缓冲区的回调函数。GetSize应该返回(通过更改指针提供的值)所使用的OpenGL缓冲区/上下文的大小。MakeCurrent应该将自定义缓冲区设置为当前的OpenGL上下文。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-04 13:37:21

MakeCurrent (定义为void _stdcall MakeCurrent(void))是缓冲区的回调函数。

如果我理解它是正确的,这个回调将被调用,无论何时LeadWerks希望上下文变为活动(它自己不管理它自己),类似的getsize回调是为了获得可用窗口的大小。因此,通常您会使用它从另一个您可以访问的接口激活上下文。

不幸的是,这些回调不允许传递指针,这意味着不能传递QGLWidget类实例指针,这样就可以将调用委托给类成员函数。无法将用户数据传递给回调是API设计错误的一个标志,因为这会使事情变得很困难,否则就会很容易。

有一个名为ffCall的库,它提供了一种绕过这个http://www.gnu.org/s/libffcall/callback.html的机制。

所以你会写一个委托函数

代码语言:javascript
运行
复制
void qglwidget_makecurrent(void *data, va_list alist)
{
    GQLWidget *widget = (QGLWidget*) data;
    widget->makeCurrent();
}

void qglwidget_getsize(void *data, va_list alist)
{
    int *widthptr, *heightptr;
    GQLWidget *widget = (QGLWidget*) data;
    va_start_ptr(alist, void);
    widthptr = va_arg_ptr(alist, int*);
    heightptr = va_arg_ptr(alist, int*);
    va_return_void(alist);
    *widthptr = widget->width();
    *heightptr = widget->height();
}

将回调包装器(如QGLWidget派生类的构造函数)创建为类成员变量:

代码语言:javascript
运行
复制
class MyGLWidget : QGLWidget {
/* ... */
    __TR_function qglwidget_makecurrent_callback;
    __TR_function qglwidget_getsize_callback;
}

MyGLWidget::MyGLWidget() {
    qglwidget_makecurrent_callback = alloc_callback(qglwidget_makecurrent, (void)this);
    qglwidget_getsize_callback = alloc_callback(qglwidget_makecurrent, (void*)this);
}

那些你可以传递给LeadEngine的:

代码语言:javascript
运行
复制
buffer->CreateCustom((void(*)(int, int))qglwidget_getsize_callback, (void(*)(void))qglwidget_makecurrent_callback);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8372791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档