2010-09-03 55 views
3

好吧,这有点棘手。我正在检测应用何时进入全屏模式(捕获显示器),然后我需要偶尔绘制一些东西到捕获的显示上下文中以用于通知目的(比如Growl通知,但也必须以全屏模式工作)。绘制成全屏GL背景

是否有任何方法来修改其他应用程序的GL/CG上下文(例如Windows上的Fraps确实将FPS计数器注入到OGL应用程序中)?不幸的是,屏幕窗口叠加方法在捕获显示时不起作用。有任何想法吗?

回答

0

实际上,您可以用简单的OpenGL和Quartz显示服务绘制屏幕。有一些缺点让我不知道如何解决。

  • CGLSetFullScreen已被弃用,CGLSetFullScreenOnDisplay不会捕捉显示器工作。

  • 绘图闪烁因为其他的GL上下文与这一个

干扰。

CGOpenGLDisplayMask displayMask = CGDisplayIDToOpenGLDisplayMask(displayId); 
CGLPixelFormatAttribute attribs[] = { 
    kCGLPFAFullScreen, 
    kCGLPFADisplayMask, 
    displayMask, 
    0 
}; 

// Create gl context 
GLint numPixelFormats; 
CGLPixelFormatObj pixelFormatObj; 
CGLChoosePixelFormat(attribs, &pixelFormatObj, &numPixelFormats); 

CGLCreateContext(pixelFormatObj, NULL, &glContext); 

CGLDestroyPixelFormat(pixelFormatObj); 
CGLSetCurrentContext(glContext); 
CGLSetFullScreen(glContext); 

do { 
    glLoadIdentity(); 

    glBegin(GL_TRIANGLES); 

    glColor3f(1.0f, 0.0f, 0.0f); 
    glVertex3f(0.0f, 1.0f, 0.0f); 
    glColor3f(0.0f, 1.0f, 0.0f); 
    glVertex3f(-1.0f, -1.0f, 0.0f); 
    glColor3f(0.0f, 0.0f, 1.0f); 
    glVertex3f(1.0f, -1.0f, 0.0f); 

    glEnd(); 
    glFlush(); 

} while (!invalid); 
0

GLFullscreen示例应用程序显示了创建全屏窗口(和上下文)的旧方法和10.6+方法。新的方式只是一个屏幕大小的窗口,大多数其他的东西,而旧的方式是一种特殊的全屏模式,不会让其他任何东西在CGL上面绘制。所以如果应用程序使用新的简化机制,它可能会有所作为。我猜你不能用旧的方式,但可以用新的方式。

+0

是的,但这不是问题。问题是我如何修改其他应用程序捕获的屏幕内容。 – 2010-09-03 20:07:56

+0

我知道,我想说这可能取决于OTHER应用程序创建全屏幕上下文的方式。 – mk12 2010-09-03 20:46:14

+0

我尝试了不推荐使用的'CGLSetFullScreen',它似乎能够工作(CGLSetFullScreenOnDisplay没有),即使屏幕已经被捕获了,所以我可能会在顶部渲染一些东西。但我真的不想使用弃用的函数:(我会尝试让它与AGL调用一起工作(http://developer.apple.com/mac/library/documentation/GraphicsImaging/Reference/AGL_OpenGL/) Reference/reference.html) – 2010-09-03 22:26:17