如何在 GTK3 上强制使用 CORE opengl 配置文件? (#version 330)
How to force CORE opengl profile on GTK3? (#version 330)
下面是我创建 GTK OpenGL 上下文的方式
#include <GL/glew.h>
#include <GL/glx.h>
#...
void OpenGLArea::on_realize()
{
Gtk::DrawingArea::on_realize();
on_glx_init();
// Initialize GLEW
glewExperimental = true; // Needed for core profile
if (glewInit() != GLEW_OK)
{
throw std::runtime_error("Failed to initialize GLEW");
}
std::cout << "Vendor: ........... " << glGetString(GL_VENDOR) << std::endl;
std::cout << "Renderer: ......... " << glGetString(GL_RENDERER) << std::endl;
std::cout << "Version: .......... " << glGetString(GL_VERSION) << std::endl;
std::cout << "GLSL version: ..... " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
glInit();
}
void OpenGLArea::on_glx_init()
{
GLint glx_attrs[] = {
GLX_RGBA,
GLX_RED_SIZE,
8,
GLX_GREEN_SIZE,
8,
GLX_BLUE_SIZE,
8,
GLX_ALPHA_SIZE,
8,
GLX_DEPTH_SIZE,
24,
GLX_STENCIL_SIZE,
8,
GLX_DOUBLEBUFFER,
False,
None,
};
xdisplay = GDK_WINDOW_XDISPLAY(Glib::unwrap(get_window()));
drawable = GDK_WINDOW_XID(Glib::unwrap(get_window()));
const std::unique_ptr<XVisualInfo, XVisualInfoDeleter> visual_info(glXChooseVisual(xdisplay, DefaultScreen(xdisplay), glx_attrs));
if (!visual_info)
{
throw std::runtime_error("failed glXChooseVisual.");
}
context = glXCreateContext(xdisplay, visual_info.get(), nullptr, True);
if (!context)
{
throw std::runtime_error("failed glXCreateContext.");
}
if (!glXMakeCurrent(xdisplay, drawable, context))
{
throw std::runtime_error("failed glXMakeCurrent.");
}
}
但是,我无法在着色器中使用 #version 330
。我搜索了很多地方,但我只能在 GLEW 中找到如何做。我想在 GTK/GL 库中做(我不知道如何区分什么是 Open GL 什么是 GTK)
我放弃了调整配置选项的尝试,只是简单地修改了这个示例:https://github.com/agrechnev/gtkmm-fun/tree/master/glarea0 这很有效
下面是我创建 GTK OpenGL 上下文的方式
#include <GL/glew.h>
#include <GL/glx.h>
#...
void OpenGLArea::on_realize()
{
Gtk::DrawingArea::on_realize();
on_glx_init();
// Initialize GLEW
glewExperimental = true; // Needed for core profile
if (glewInit() != GLEW_OK)
{
throw std::runtime_error("Failed to initialize GLEW");
}
std::cout << "Vendor: ........... " << glGetString(GL_VENDOR) << std::endl;
std::cout << "Renderer: ......... " << glGetString(GL_RENDERER) << std::endl;
std::cout << "Version: .......... " << glGetString(GL_VERSION) << std::endl;
std::cout << "GLSL version: ..... " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl;
glInit();
}
void OpenGLArea::on_glx_init()
{
GLint glx_attrs[] = {
GLX_RGBA,
GLX_RED_SIZE,
8,
GLX_GREEN_SIZE,
8,
GLX_BLUE_SIZE,
8,
GLX_ALPHA_SIZE,
8,
GLX_DEPTH_SIZE,
24,
GLX_STENCIL_SIZE,
8,
GLX_DOUBLEBUFFER,
False,
None,
};
xdisplay = GDK_WINDOW_XDISPLAY(Glib::unwrap(get_window()));
drawable = GDK_WINDOW_XID(Glib::unwrap(get_window()));
const std::unique_ptr<XVisualInfo, XVisualInfoDeleter> visual_info(glXChooseVisual(xdisplay, DefaultScreen(xdisplay), glx_attrs));
if (!visual_info)
{
throw std::runtime_error("failed glXChooseVisual.");
}
context = glXCreateContext(xdisplay, visual_info.get(), nullptr, True);
if (!context)
{
throw std::runtime_error("failed glXCreateContext.");
}
if (!glXMakeCurrent(xdisplay, drawable, context))
{
throw std::runtime_error("failed glXMakeCurrent.");
}
}
但是,我无法在着色器中使用 #version 330
。我搜索了很多地方,但我只能在 GLEW 中找到如何做。我想在 GTK/GL 库中做(我不知道如何区分什么是 Open GL 什么是 GTK)
我放弃了调整配置选项的尝试,只是简单地修改了这个示例:https://github.com/agrechnev/gtkmm-fun/tree/master/glarea0 这很有效