使用Gtk +的OpenGL,尽管背景被清除,但不会绘制形状

时间:2016-02-25 12:48:37

标签: c++ c opengl gtk

我试图让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;
}

1 个答案:

答案 0 :(得分:1)

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

  

[...] GTK +中的OpenGL支持需要核心GL配置文件,因此它不适用于OpenGL 3.2及更高版本之前常见的固定管道API。这意味着你将无法使用像glRotatef(),glBegin()/ glEnd()对或其他任何东西的API。

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