混合Quartz和OpenGL?

时间:2011-08-23 15:30:49

标签: cocoa macos opengl core-animation core-graphics

当我们这样做时,我试图找出背景中实际发生的事情(请参见图片)

enter image description here

正如您在图像中看到的,我添加了几个按钮,并从“界面”构建器中检查了窗口的内容视图。

现在我们知道它将使用核心动画或者说会创建图层。 (如果我错了,请纠正我。还在学习......)

我想知道这些按钮是如何绘制的?

我的假设是当我们勾选内容视图时,这些按钮是从CGBitmapContextRef中提取的,并且从它创建的位图被移交给Core Animation(OpenGL)。但到目前为止我无法证明这一点。我该如何证明? 任何一个例子或一些方法的想法都会很棒?

我确定是从CGBitmapContextRef创建的按钮。但是那些按钮图像会发生什么事情是未知的。

任何人都可以解释这种整合怎么可能?这些图像将如何出现在屏幕上?

编辑:

要添加有关同一主题的更多信息,请查看下图中的OpenGL图层。我认为我的目标是常见的OpenGL Framework 层。 enter image description here

2 个答案:

答案 0 :(得分:1)

我首先要制作一个可以永久重新绘制按钮的紧凑循环。然后,在它运行时,使用Activity Monitor对您的流程进行示例跟踪。您将看到绘制按钮所需的所有代码路径。您应该能够从绘图堆栈中的例程名称中看到正在发生的事情。如果你无法理解它,请发布相关位,在这里我们可以看看。

答案 1 :(得分:0)

按钮在CGBitmapContextRef上绘制。

让我们说,我们使用

创建了CGBitmapContextRef对象
CGContextRef CGBitmapContextCreate (
   void *data,
   size_t width,
   size_t height,
   size_t bitsPerComponent,
   size_t bytesPerRow,
   CGColorSpaceRef colorspace,
   CGBitmapInfo bitmapInfo
);

此处void *data是指向要在其中呈现图形的内存中的目标的指针。

然后可以使用CGContext API对data执行各种操作。因此可以在上面绘制按钮和背景。

完成后我们可以释放CGContextRef,但数据仍在内存中,可以传递给OpenGLContext(CGLContextObj)。

我仍然不知道它如何将data上传到CGLContextObj。必须使用一些私人api。