1

我正在尝试让 GTK+ 3.16 的新 GLArea 小部件工作。它旨在提供内置的 OpenGL 支持,而不依赖于过时的 GtkGLExt/GtkGLArea 项目。由于我还不愿意将我的工作发行版更新到 Gnome 3.16,所以我使用 Gnome Boxes 在虚拟机上安装了 Fedora 22 Alpha。

ebassi 的博客文章之后,我在我的窗口 UI 文件中添加了一个 GLArea 子项:

<child>
    <object class="GtkGLArea" id="gl_drawing_area">
        <signal name="realize" handler="gl_init" swapped="yes"/>
        <signal name="unrealize" handler="gl_fini" swapped="yes"/>
        <signal name="render" handler="gl_draw" swapped="yes"/>
        <property name="visible">True</property>
        <property name="can_focus">False</property>
        <property name="hexpand">True</property>
        <property name="vexpand">True</property>
    </object>
</child>

并连接信号。我应该说我正在使用 Vala 作为我的 UI 代码。实际的 OpenGL 代码旨在进入我将从gl_drawVala 方法调用的 C 函数。目前,三个 Vala 函数只打印它们的名称。

确实,gl_init并被gl_fini调用。但 GLArea 小部件显示此错误消息:

创建核心配置文件所需的 GLX_ARB_create_context_profile 扩展不可用

我还尝试运行 ebassi 自己的示例程序(GitHub)。它甚至不显示 UI,而是输出

glarea:找不到当前的 GLX 或 EGL 上下文。

马上在终端上。

但是,运行glxinfo告诉我我安装了该扩展:

name of display: :0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.4
server glx extensions:
    GLX_ARB_multisample, GLX_EXT_import_context, GLX_EXT_texture_from_pixmap, 
    GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_MESA_copy_sub_buffer, 
    GLX_OML_swap_method, GLX_SGIS_multisample, GLX_SGIX_fbconfig, 
    GLX_SGIX_pbuffer, GLX_SGI_make_current_read
client glx vendor string: Mesa Project and SGI
client glx version string: 1.4
client glx extensions:
    GLX_ARB_create_context, GLX_ARB_create_context_profile, 
    GLX_ARB_create_context_robustness, GLX_ARB_fbconfig_float, 
    GLX_ARB_framebuffer_sRGB, GLX_ARB_get_proc_address, GLX_ARB_multisample, 
    GLX_EXT_buffer_age, GLX_EXT_create_context_es2_profile,
...

glxgears也运行没有问题。

此外,我在 Github 中克隆了GNOME/gtkglarea 存储库,自己编译并运行示例,没有任何问题。我知道这个项目在正式包含在 GTK 之前开发了 GLArea 小部件?(我错了。)

4

1 回答 1

2

在虚拟化环境下运行总是相当棘手。

即使您看到扩展,您也可能无法创建正确的 GLX 上下文,因为 GTK+ 使用的最低版本(即 3.2)有要求;Mesa 中的 llvmpipe 软件光栅化器不完全支持 OpenGL 3.2,因为某些必需的扩展已受专利保护。有关详细信息以及未来的计划,请参阅错误 744407 。

顺便说一句:通常,能够运行glxgears并不意味着能够使用 OpenGL——除了非常古老的 1.x 固定管道 API。就像它不是 OpenGL 基准一样,glxgears恐怕也不是 OpenGL 可用性的一个很好的指标。

于 2015-04-02T12:08:53.837 回答