自制的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。)。