是否可以在Gtk2中为OSX替换cgl的wgl / glx?

时间:2016-01-20 17:36:43

标签: c++ macos opengl gtk

自制的gtk +版本最近已转移到没有X11的纯Quartz版本。在我们的项目中,我们一直在使用glx初始化OpenGL上下文,并在Linux和OSX(以及Windows上的wgl)上为OpenGL设置Gtk视口。这已经在OSX上打破了。

我现在正在寻找一种方法来获取Gtk小部件窗口的句柄,并使用CGL创建的opengl上下文来绘制它。我没有写原始代码,所以我有点不知所措。

使用wgl,有趣的部分看起来像这样(widget包含指向GtkWidget的指针,它将被OpenGL视图替换):

HWND window = (HWND)GDK_WINDOW_HWND(::gtk_widget_get_window(widget));
HDC  drawingContext = ::GetDC(window);
PIXELFORMATDESCRIPTOR pixelFormatDescriptor;

// Insert some PixelFormat initialisation here
int pixelFormatIdentifier = ChoosePixelFormat(drawingContext, &pixelFormatDescriptor);
SetPixelFormat(drawingContext, pixelFormatIdentifier, &pixelFormatDescriptor)

HGLRC GLRenderingContext = wglCreateContext(drawingContext);

在Linux(使用gdkx)上,它以这种方式初始化:

::GdkScreen* screen = ::gdk_screen_get_default();
::Display* display = GDK_SCREEN_XDISPLAY(screen);
::gint screenNumber = GDK_SCREEN_XNUMBER(screen);

int visualInfoAttributes[]=
{
    GLX_RGBA,
    GLX_RED_SIZE,    1,
    GLX_GREEN_SIZE,  1,
    GLX_BLUE_SIZE,   1,
    GLX_ALPHA_SIZE,  1,
    GLX_DOUBLEBUFFER,
    GLX_DEPTH_SIZE,  1,
    None
};
::XVisualInfo* visualInfo = ::glXChooseVisual(display, screenNumber, visualInfoAttributes);
::GLXContext glRenderingContext = glXCreateContext(display, visualInfo, NULL, False);

然后在绘制到窗口小部件之前,以这种方式设置上下文:

::Window window = GDK_WINDOW_XID(gtk_widget_get_window(widget));
::glXMakeCurrent(display, window, glRenderingContext);

如何(如果有的话)使用CGL实现这一目标?我宁愿留在C ++,因为该项目目前不使用任何Objective-C代码,我宁愿不包括任何外部库(SDL和co。)。

0 个答案:

没有答案