[英]How do I pass an OpenGL context from Qt4?
我目前正在使用LeadWerks 2引擎開發游戲,並且我決定使用Qt4作為GUI和窗口管理器。 我要做的是創建一個Qt QGLWidget窗口,並在其中運行LeadWerks引擎。 這里有一些有關構建基本QGLWidget應用程序的信息 。
我真的很難理解如何准確地做到這一點。 我可以在LeadWerks引擎中創建一個自定義的GL緩沖區,我相信我需要做的就是為該緩沖區提供Qt創建的GL上下文。 至於LeadWerks方面,我需要做的主要事情是調用一個名為CreateCustomBuffer的方法並將其傳遞給一些方法:
虛擬void Buffer :: CreateCustom(byte * getsize,byte * makecurrent)
創建並返回一個新的自定義緩沖區。 GetSize(定義為void _stdcall GetSize(int * width,int * height))和MakeCurrent(定義為void _stdcall MakeCurrent(void))是緩沖區的回調函數。 GetSize應該返回(通過更改指針提供的值)所使用的custum OpenGL緩沖區/上下文的大小。 MakeCurrent應將自定義緩沖區設置為當前OpenGL上下文。
和MakeCurrent(定義為void _stdcall MakeCurrent(void))是緩沖區的回調函數
如果我理解正確,那么只要LeadWerks希望上下文變為活動狀態(那么它本身就不會對其進行管理), 就會調用此回調,類似於getsize回調將獲取可用窗口的大小。 因此,通常您會使用它從您要訪問的另一個界面激活上下文。
不幸的是,這些回調不允許傳遞指針,這意味着您不能傳遞QGLWidget類實例指針,因此可以將調用委派給類成員函數。 無法將用戶數據傳遞給回調是API設計不良的標志,因為這會使事情變得很難,否則會很容易。
有一個名為ffcall的庫,它提供了一種繞過此http://www.gnu.org/s/libffcall/callback.html的機制
所以你要寫一個委托函數
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派生類的構造函數)作為類成員變量:
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的那些:
buffer->CreateCustom((void(*)(int, int))qglwidget_getsize_callback, (void(*)(void))qglwidget_makecurrent_callback);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.