Добавление окна OpenGL в компоновщик GTK - PullRequest
3 голосов
/ 15 февраля 2012

Я пишу приложение на C ++, используя GTK и OpenGL. У меня есть GTK-компоновщик, который читает XML-файл и создает его сам. Мне нужно добавить в него «область окна OpenGL». Как мне это сделать?

1 Ответ

12 голосов
/ 16 февраля 2012

То, как я это делаю (код gtkmm / C ++), выглядит следующим образом:

#include <gtkmm.h>
#include <gtkglmm.h>

class GLWidget : public Gtk::GL::DrawingArea {
    public:
    GLWidget(Glib::RefPtr<Gdk::GL::Config> glconfig)
        : Gtk::GL::DrawingArea(glconfig) {}
    ~GLWidget() {}
    virtual bool on_expose_event(GdkEventExpose* event);
};

bool GLWidget::on_expose_event(GdkEventExpose* event)
{
    Glib::RefPtr<Gdk::GL::Drawable> d = get_gl_drawable();
    d->gl_begin(get_gl_context());

    // make this as complex as you need
    glClear(GL_COLOR_BUFFER_BIT);

    d->swap_buffers();
    d->gl_end();
    return true;
}

int main(int argc, char **argv)
{
    Gtk::Main kit(argc, argv);
    Gtk::GL::init(argc, argv);

    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("ui.glade");

    Gtk::Window* mainWindow;
    Gtk::Alignment* container;

    builder->get_widget("mainWindow", mainWindow);
    builder->get_widget("Box", container);

    if (mainWindow == NULL || container == NULL) {
        g_critical("Gtk Builder failed to load mainWindow and/or container !\n");
        return -1;
    }

    Glib::RefPtr<Gdk::GL::Config> glconfig;

    glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGBA | Gdk::GL::MODE_DOUBLE);
    if (!glconfig)
        glconfig = Gdk::GL::Config::create(Gdk::GL::MODE_RGB);
    if (!glconfig) {
        g_critical("Cannot create OpenGL-capable config\n");
        return -1;
    }

    GLWidget drawingArea(glconfig);

    drawingArea.set_size_request(640, 480);
    drawingArea.show();
    container->add(drawingArea);

    kit.run(*mainWindow);

    return 0;

Т.е. я просто загружаю пользовательский интерфейс, который содержит пустой контейнерный виджет, получаемобработайте это по имени, затем создайте область рисования с поддержкой GL в коде и добавьте ее в пустой контейнер.Предположительно, возможно «время загрузки» заменить обычную Gtk DrawingArea на GtkGL (см. в этой публикации ), но этот метод у меня не сработал;выше, программно создавая, всегда делал.

Вам нужен gtkglext / gtkglextmm для виджета GL Drawingarea.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...