带有 Gtk+ 的 OpenGL,尽管背景已清除,但未绘制形状

Posted

技术标签:

【中文标题】带有 Gtk+ 的 OpenGL,尽管背景已清除,但未绘制形状【英文标题】:OpenGL with Gtk+, shapes are not being drawn despite background being cleared 【发布时间】:2016-02-25 12:48:37 【问题描述】:

我正在尝试让 OpenGL 与 gtk+ 一起工作。它似乎是工作尺寸,我能够清除背景颜色。但是,当我去画一些东西时,它不在那里。我是不是错过了什么。我把眼睛放在 10、10、10 处,我正在看原点。我应该在原点附近看到一个后三角。

#include <gtk/gtk.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <iostream>

GtkWidget* wnd;
GtkWidget* glarea;

static gboolean render(GtkGLArea *area, GdkGLContext *context)

    int w = gtk_widget_get_allocated_width(GTK_WIDGET(area));
    int h = gtk_widget_get_allocated_height(GTK_WIDGET(area));
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(180, (double)w / (double)h, 0.1, 100.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(10, 10, 10, 0, 0, 0, 0, 1, 0);

    glClearColor(1, 1, 1, 0);
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0, 0, 0);
    glBegin(GL_TRIANGLES);
    glVertex3f(0, 0, 0);
    glVertex3f(-1, 2, -1);
    glVertex3f(1, 3, 2);
    glEnd();

    return TRUE;


int main(int argc, char *argv[])

    gtk_init(&argc, &argv);
    wnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    glarea = gtk_gl_area_new();

    gtk_container_add(GTK_CONTAINER(wnd), glarea);
    g_signal_connect(wnd, "destroy", gtk_main_quit, 0);

    g_signal_connect(glarea, "render", G_CALLBACK(render), NULL);

    gtk_widget_show_all(wnd);
    gtk_main();
    return 0;

【问题讨论】:

为什么是 180 度 FOV 而不是 60 或 90 度? 我原本是 60 岁的。我打开它看看我能不能找到那个形状。 60 也有同样的问题 您的 core drawing code in a GLUT MCVE (with the FOV fix) 在我的系统上似乎是 work fine。 不是 GTK 专家,但您可能需要以某种方式刷新/交换缓冲区以强制更新到屏幕。也许在return TRUE 之前扔一个glFlush() ...gtk_gl_area_swap_buffers()? 【参考方案1】:

来源:Emanuele Bassi's blog - GTK+ developer

[...] GTK+ 中的 OpenGL 支持需要核心 GL 配置文件,因此它不能与 OpenGL 3.2 及更高版本之前常见的固定管道 API 一起使用。这意味着您将无法使用诸如 glRotatef()、glBegin()/glEnd() 对或任何类似的 API。

解决方案:删除固定功能管道。

【讨论】:

以上是关于带有 Gtk+ 的 OpenGL,尽管背景已清除,但未绘制形状的主要内容,如果未能解决你的问题,请参考以下文章

Perl/Gtk3,给窗口添加背景图片

使用 OpenGL 编译 GTK+

GtkGLArea 清除背景但不绘制

尽管 Angular 中的表单已重置,但输入字段仍标记为红色

有没有办法在 GTK3 应用程序中拥有 OpenGL 上下文?

当 Gtk.Box 在任何地方单击时如何打开网页,尽管其中有 Gtk.LinkBut​​ton 链接?