歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OS X的CAOpenGLLayer中如何啟用OpenGL3.2 core profile

在OS X的openGL編程中,我們有時為了想在自己的OpenGL圖層上再加些自己的某些塗層,必須得用CAOpenGLLayer而不是NSOpenGLView,由於在NSOpenGLView上添加任何子視圖都會變得無效。

其實,在CAOpenGLLayer自定義的子類中要追加支持OpenGL Core Profile很簡單,只需要重寫其

- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask

方法即可。如以下代碼所示:

// 重寫父類的方法,提供自己的CGLPixelFormatObj
- (CGLPixelFormatObj)copyCGLPixelFormatForDisplayMask:(uint32_t)mask
{
    CGLPixelFormatAttribute attribs[] =  {
       
        kCGLPFADisplayMask, 0,
        kCGLPFAColorSize, 24,
        kCGLPFAAccelerated,
        kCGLPFADoubleBuffer,
       
        // Use OpenGL 3.2 Core Profile
        kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core,
       
        // Use multi-sample
        kCGLPFAMultisample,
        kCGLPFASampleBuffers, (CGLPixelFormatAttribute)1,
        kCGLPFASamples, (CGLPixelFormatAttribute)4,
       
        0
    };
    // 將kCGLPFADisplayMask設置為傳遞過來的display mask。這個步驟是必須的!
    attribs[1] = mask;
   
    CGLPixelFormatObj pixFormatObj = NULL;
    GLint numPixFormats = 0;
    CGLChoosePixelFormat(attribs, &pixFormatObj, &numPixFormats);
   
    return pixFormatObj;
}

 

 

然後,我們可以在自己的子類中添加對CGLContextObj對象的引用來做一些標記。另外,我們必須重寫CAOpenGLLayer的這個方法:

- (void)drawInCGLContext:(CGLContextObj)glContext

            pixelFormat:(CGLPixelFormatObj)pixelFormat

            forLayerTime:(CFTimeInterval)timeInterval

            displayTime:(const CVTimeStamp *)timeStamp

比如像以下代碼所示:

- (void)drawInCGLContext:(CGLContextObj)glContext
            pixelFormat:(CGLPixelFormatObj)pixelFormat
            forLayerTime:(CFTimeInterval)timeInterval
            displayTime:(const CVTimeStamp *)timeStamp
{
    // 這裡必須先將傳進來的上下文作為當前OpenGL執行上下文對象,否則後續對OpenGL的狀態設置都將無效
    CGLSetCurrentContext(glContext);
   
    [self setupContext];
   
    // mContext主要用於判別當前OpenGL上下文是否已經設置好,以及在render方法中的引用
    mContext = glContext;
   
    [self render];
}

 

- (void)setupContext是自定義方法,在裡面做頂點設置、全局啟用某些OpenGL功能狀態,並設置viewport等等。

- (void)render也是自定義方法,用來做真正的圖形繪制。

如以下代碼所示:

- (void)render
{
    // render
    glClear(GL_COLOR_BUFFER_BIT);
   
    glDrawArrays(GL_LINE_STRIP, 0, 721);
   
    glFlush();
   
    CGLFlushDrawable(mContext);
}

隨後,我們自己提供shader代碼,並進行加載即可。這些可以放在setupContext自定義方法中實現。

當然,在OS X中要使用OpenGL core profile必須引入<OpenGL/gl3.h>這個頭文件。目前,3.2 core profile以及4.1 core profile都是用此頭文件。

OpenGL編程指南(原書第7版)中文掃描版PDF 下載 http://www.linuxidc.com/Linux/2012-08/67925.htm

-------------------------------------分割線-------------------------------------

OpenGL 渲染篇 http://www.linuxidc.com/Linux/2011-10/45756.htm

Ubuntu 13.04 安裝 OpenGL http://www.linuxidc.com/Linux/2013-05/84815.htm

OpenGL三維球體數據生成與繪制【附源碼】 http://www.linuxidc.com/Linux/2013-04/83235.htm

Ubuntu下OpenGL編程基礎解析 http://www.linuxidc.com/Linux/2013-03/81675.htm

如何在Ubuntu使用eclipse for c++配置OpenGL http://www.linuxidc.com/Linux/2012-11/74191.htm

《OpenGL超級寶典》學習筆記 http://www.linuxidc.com/Linux/2013-10/91414.htm

Copyright © Linux教程網 All Rights Reserved