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

摘要:
在OSX的openGL编程中,我们有时为了想在自己的OpenGL图层上再加些自己的某些涂层,必须得用CAOpenGLLayer而不是NSOpenGLView,由于在NSOpenGLView上添加任何子视图都会变得无效。另外,我们必须重写CAOpenGLLayer的这个方法:-drawInCGLContext:glContextpixelFormat:pixelFormatforLayerTime:timeIntervaldisplayTime:timeStamp。当然,在OSX中要使用OpenGLcoreprofile必须引入这个头文件。目前,3.2coreprofile以及4.1coreprofile都是用此头文件。

在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);
    returnpixFormatObj;
}

然后,我们可以在自己的子类中添加对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都是用此头文件。

免责声明:文章转载自《OS X的CAOpenGLLayer中如何启用OpenGL3.2 core profile》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇什么是BULK INSERTwin7 硬盘安装suse双系统启动顺序更改下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

OpenGL学习——搭建OpenGL运行环境——生成一个空白视口——基于GLFW&amp;amp;GLEW

    最近学习OpenGL,读OpenGL宝典一头蒙,各种gl函数不知所云。逐决定先搭OpenGL运行环境,详细如下。     1、首先OpenGL是什么?是一个标准规范,是一个巨大的状态机,并无具体实现,大多数实现都是由显卡厂商编写的。         创建一个OpenGL上下文(Context)和一个用于显示的窗口,这个很底层。当然有一些库可以选择,...

core文件找不到了

开始以为是core文件太大,设置ulimit -c unlimited 以后,再次访问,显示 ./a.out Segmentation fault (core dumped) 但是却找不到这个文件的地方,最后 sysctl kernel.core_patternkernel.core_pattern = /apsara/tubo/corefile/core...

sysctl内核参数解析

sysctl内核参数解析 kernel.参数 kernel.shmall = 2097152 ## 1>表示所有内存大小。可以分配的所有共享内存段的总和最大值。(以页为单位) ## 2>该参数以页为单位,linux共享内存页一般为4k,oracle默认参数是2097152,如果系统内存大于该参数,才考虑调整 ## 3>如何计算:20971...

linux编程中的段错误

linux上用C/C++写程序时,很容易碰到段错误的提示,此时程序被自动终止。这个问题是由于非法访问内存引起的,一般的原因都是因为程序中的指针解引用出现了错误。出现段错误是,linux一般会生成一个core dump文件,如果没有生成,可能是因为分配给core dump文件的控件为0,可以用ulimit -c命令查看,如果为0,core dump文件不会生...

利用pyinstaller打包加密Python项目

  最近用Python给媳妇写了两个小项目,给解决了她的每天重复的一些人工操作。媳妇很开心,但是问题来了,她是个Python小白,对她来说,需要安装配置Python环境和一大堆第三方模块是个麻烦事儿。而且后续把这些工作交接给别人的话,一是又需要重新安装Python环境,二是我辛苦给她写的源码就这样暴露了。   为了解决这个问题,于是就开始百度。果然Pyth...

Linux下C++编程环境搭建

  有更简单的方法:在装机器的时候选择  开发工作站系统  development workstation 工作站。免去安装java jdk ,eclipse ,g++,ssh等等各种工具的麻烦。  需要注意的是通过虚拟机安装的时候,要先创建空虚拟机,再从虚拟光驱安装,不要直接选择操作系统类型,不然会默认给安装最简化版的。光中文的设置,和输入法安装 就能让...