代码之家  ›  专栏  ›  技术社区  ›  Era

绘制为全屏GL上下文

  •  3
  • Era  · 技术社区  · 14 年前

    好吧,这有点棘手。我正在检测应用程序何时进入全屏模式(捕获显示),然后我需要偶尔在捕获的显示上下文中绘制一些内容以用于通知目的(如咆哮通知,但也必须在全屏模式下工作)。

    是否有任何方法可以修改其他应用程序的gl/cg上下文(例如,Windows上的fraps是否将fps计数器注入到ogl应用程序中)?不幸的是,当捕获显示器时,屏蔽窗口覆盖方法不起作用。有什么想法吗?

    2 回复  |  直到 13 年前
        1
  •  0
  •   mk12    14 年前

    这个 GLFullscreen 示例应用程序展示了创建全屏窗口(和上下文)的旧方法和10.6+方法。新的方法只是一个屏幕大小的窗口,比大多数其他东西都要高,而旧的方法是一种特殊的全屏模式,它不允许任何其他东西超越它,使用CGL。因此,如果应用程序使用新的、简化的机制,可能会有所不同。我猜你不能用老办法,但也许能用新办法。

        2
  •  0
  •   Era    13 年前

    实际上,您可以使用普通的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);