我以前一直在使用GtkGL擴展來渲染嵌入在gtk中的opengl,我想我會升級到GTK + 3.16並使用內置的支持。 我不幸遇到了一個我無法弄清楚的障礙。GTK + 3 OpenGL:OpenGL調用失敗
我可以成功初始化GdkGLContext(我這樣做是我的主窗口REALIZE信號):
m_window = gtk_widget_get_window(widget);
GError* err = nullptr;
m_context = gdk_window_create_gl_context(m_window, &err);
ASSERT_FORMAT(m_context != nullptr, "Failed to create OpenGL context for editor window (%s)", err->message);
gdk_gl_context_set_required_version(m_context, 4, 5);
gboolean success = gdk_gl_context_realize(m_context, &err);
ASSERT_FORMAT(success == TRUE, "Failed to realize Editor GL context (%s)", err->message);
gdk_gl_context_make_current(m_context);
Logging::verbose("OpenGL Device: %s - %s.\n", glGetString(GL_VENDOR), glGetString(GL_RENDERER));
Logging::verbose("Version supported: %s, %s\n", glGetString(GL_VERSION), glGetString(GL_SHADING_LANGUAGE_VERSION));
這似乎只要我努力工作,它不給任何錯誤或glError,雖然使用「invalid enum」做任何opengl調用失敗: (例如:我做的第一件事是glEnable(GL_CULL_FACE),失敗時顯示「invalid enum」)。當它無法創建幀緩衝區或着色器時,它最終崩潰。
我的猜測是,這在某種程度上是由創建GdkWindow時使用了錯誤的設置引起的,但我無法弄清楚是什麼。 我打印有關GdkVisual和OpenGL上下文的一些調試信息:
Bits per RGB: 8. Byte order: LSB
Visual Type: GDK_VISUAL_TRUE_COLOR
OpenGL Device: NVIDIA Corporation - GeForce GTX 970/PCIe/SSE2.
Version supported: 4.5.0 NVIDIA 361.42, 4.50 NVIDIA
(這實際上是甚至有點怪異,OpenGL的信息來自glGetString,所以這些OpenGL調用至少似乎工作)。
我有相同的代碼與SDL窗口運行,並在那裏工作正常。
我在Ubuntu 16.04上運行GTK + 3版本3.18.9。
我也嘗試創建一個GtkGLArea,但是這給出了相同的問題。
我的理論是它與OpenGL上下文創建的參數有關,因爲它以前用GtkGLExt工作,但沒有用GTK + 3.16的GdkGLContext,但我無法弄清楚什麼參數是錯誤。
哪個「任何OpenGL調用」你有問題?你在訪問OpenGL函數之前使用OpenGL加載器嗎? –
我正在使用libepoxy加載gl符號。但我想我已經明白了。 GTK + 3在覈心配置文件中加載opengl,並且我的程序的某些部分不符合核心配置文件,所以實際上只有那些失敗的調用。 – Torandi