2016-05-15 43 views
1

我以前一直在使用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,但我無法弄清楚什麼參數是錯誤。

+1

哪個「任何OpenGL調用」你有問題?你在訪問OpenGL函數之前使用OpenGL加載器嗎? –

+0

我正在使用libepoxy加載gl符號。但我想我已經明白了。 GTK + 3在覈心配置文件中加載opengl,並且我的程序的某些部分不符合核心配置文件,所以實際上只有那些失敗的調用。 – Torandi

回答

0

原來我的問題是,我的代碼不是OpenGL核心配置文件兼容。 因此,如果有人遇到類似的問題:確保您的OpenGL調用遵循核心配置文件(即VAO總是綁定,並且某些功能已被刪除)。