簡體   English   中英

如何從Qt4傳遞OpenGL上下文?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM