将窗口选项添加到我的openGL渲染器窗口

时间:2015-05-25 14:55:25

标签: user-interface opengl renderer

我花了3个小时安装GTK并且它可以工作,但我不知道如何将它添加到openGL渲染器中,我没有找到任何一个简单示例的好教程...有人能告诉我一个好的库使用和易于安装?我认为这很难,但我找不到任何可以帮助我的事情。这就是我想要的http://gyazo.com/543b66d1d1da8c9e05bda62d2663778f我现在拥有openGL中的所有东西,现在我的目标就是这样:http://tombraiders.net/stella/images/TRLE/trle_screenshot_lg.jpg但更简单的开始...感谢阅读。 PD:我不想要CEGUI,因为它是重叠的,它对我不起作用......

1 个答案:

答案 0 :(得分:0)

我想你有gtk版本3.16。您需要使用gtk opengl渲染器,使用GtkGLArea小部件隐藏您的gtk代码。您可以使用Glade构建界面,但我不知道上一版本是否已支持GtkGLArea。

gtk3 reference manual提供了一个小代码示例。这是一个小教程:tutorial和示例的files。关于此page的另一个简单代码。

您可以测试以下代码,以显示三角形,但我没有测试过,因为GtkGLArea不能在我的mingw系统上运行,但无论如何它可能会帮助你,你可能需要通过-lopengl或 - lopengl32或-lepoxy编译:

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

static gboolean
render (GtkGLArea *area, GdkGLContext *context) {
  // inside this function it's safe to use GL; the given
  // #GdkGLContext has been made current to the drawable
  // surface used by the #GtkGLArea and the viewport has
  // already been set to be the size of the allocation

  // we can start by clearing the buffer
  glClearColor (0, 0, 0, 0);
  glClear (GL_COLOR_BUFFER_BIT);

  // draw your object
  // draw_an_object ();
  glBegin(GL_TRIANGLES);
    glColor3ub(255,0,0);    glVertex2d(-0.75,-0.75);
    glColor3ub(0,255,0);    glVertex2d(0,0.75);
    glColor3ub(0,0,255);    glVertex2d(0.75,-0.75);
  glEnd();

  glFlush();

  // we completed our drawing; the draw commands will be
  // flushed at the end of the signal emission chain, and
  // the buffers will be drawn on the window
  return TRUE;
}

GtkWidget * create_window1() {
  GtkWidget * window1 = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_title (GTK_WINDOW (window1), "test gtk3");
  gtk_window_set_has_resize_grip(GTK_WINDOW (window1), false);

  GtkWidget * vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
  gtk_widget_show (vbox);
  gtk_container_add (GTK_CONTAINER (window1), vbox);

  // create a GtkGLArea instance:
  GtkWidget *gl_area = gtk_gl_area_new ();
  gtk_widget_show (gl_area);
  // add it to the vbox:
  gtk_container_add (GTK_CONTAINER (vbox), gl_area);

  // connect to the "render" signal:
  g_signal_connect (gl_area, "render", G_CALLBACK (render), NULL);

  return window1;
}



int main(int argc, char *argv[]) {
  gtk_init (&argc, &argv);

  GtkWidget * window1 = create_window1 ();
  gtk_widget_show (window1);
  g_signal_connect ((gpointer) window1, "destroy", G_CALLBACK(gtk_main_quit), NULL);

  gtk_main ();
}