在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, ,
kCGLPFAColorSize, ,
kCGLPFAAccelerated,
kCGLPFADoubleBuffer, // Use OpenGL 3.2 Core Profile
kCGLPFAOpenGLProfile, (CGLPixelFormatAttribute)kCGLOGLPVersion_3_2_Core, // Use multi-sample
kCGLPFAMultisample,
kCGLPFASampleBuffers, (CGLPixelFormatAttribute),
kCGLPFASamples, (CGLPixelFormatAttribute), };
// 将kCGLPFADisplayMask设置为传递过来的display mask。这个步骤是必须的!
attribs[] = mask; CGLPixelFormatObj pixFormatObj = NULL;
GLint numPixFormats = ;
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, , ); 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的更多相关文章

  1. vs for Mac中的启用Entity Framework Core .NET命令行工具

    在vs for Mac的工具菜单中已没有了Package Manager Console. 我们可以通过以下方法使用Entity Framework Core .NET命令行工具: 1.添加Nuget ...

  2. 网页中如何启用QQ交谈

    很多网友都会发现好多的网页中会有诸如,网页中如何启用QQ交谈? 1. 登录QQ, 打开网址:http://shang.qq.com/v3/widget.html 启用QQ通讯组件. 2. 选择组件样式 ...

  3. 在Mac OS X 10.8中配置Apache + PHP + MySQL

    在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apache 配置PHP 安装MySQL 配置PHPAdmin 设置数据库默认字符集 一. 配置Apache 1. ...

  4. Windows 8.1中怎么启用Framework3.5或2.0 ( 一安装就跳到下载 Win8.1自带了Framework)

    Windows 8.1中怎么启用Framework3.5或2.0      ( 一安装就跳到下载 Win8.1自带了Framework): Win+X键 打开   开始菜单 -> 命令提示符(管 ...

  5. 【Xamarin挖墙脚系列:关闭 OS X El Capitan 中 SIP 安全设置功能】

    比如需要修改内核配置文件: com.apple.Boot.plist 那么我们需要解锁权限. 禁止SIP模式,那么就可以修改此文件了. 在 OS X El Capitan 中有一个跟安全相关的模式叫 ...

  6. 在Mac OS X 10.8中配置Apache+PHP+MySQL

    在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apache 配置PHP 安装MySQL 配置PHPAdmin 设置数据库默认字符集 一. 配置Apache 1. ...

  7. OS X 和iOS 中的多线程技术(上)

    OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...

  8. OS X 和iOS 中的多线程技术(下)

    OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...

  9. OS X 10.11 中的安全删除文件

    在 OS X 10.11 中安全倾倒垃圾桶这个功能已经被取消了.是因为 SSD 闪存硬盘的原因 . 安全删除操作并不能安全清除. 所以就直接取消了. 但是其实其实还是可以在系统内使用安全删除功能的. ...

随机推荐

  1. 用.htaccess 禁止IP访问

    用.htaccess 禁止某IP访问 Order Allow,Deny Allow from all Deny from 1.1.1.1 2.2.2.2 3.3.3.3 允许所有,禁止xxxx,请将里 ...

  2. CSRF(cross-site request forgery )跨站请求攻击

    CSRF(cross-site request forgery )跨站请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,通过 ...

  3. 大数据之路week04--day03(网络编程)

    哎,怎么感觉自己变得懒了起来,更新博客的频率变得慢了起来,可能是因为最近得知识开始变得杂变得难了起来,之前在上课的时候,也没有好好听这一方面的知识,所以,现在可以说是在学的新的知识,要先去把新的知识思 ...

  4. JS中constructor,prototype

    First: this this定义: this就是函数赖以执行的对象. 分析这句话: 1. this是对象. 2. this依赖函数执行的上下文环境. 3. this存在函数中. 直接看例子: al ...

  5. php 的一个异常处理程序

    <?php//exceptionHandle.php xiecongwen 20140620 //define('DEBUG',true); /** * Display all errors w ...

  6. 存储过程:SET Transaction Isolation Level Read语法的四种情况

    这几天一直在弄存储过程,现在在这里跟大伙共享下资料: SET Transaction Isolation Level Read UNCOMMITTED 使用这句东东呢可以分为四种情况,现在就在这里逐一 ...

  7. iar8.32版本关于cmsis的说明

    平台是cubemx5.3 keil5.26 带freertos,使用iar8.32,在上图中的use cmsis 打勾与否都能编译通过.

  8. P1169 [ZJOI2007]棋盘制作 悬线法or单调栈

    思路:悬线法\(or\)单调栈 提交:2次 错因:正方形面积取错了\(QwQ\) 题解: 悬线法 讲解:王知昆\(dalao\)的\(PPT\) 详见代码: #include<cstdio> ...

  9. How to change the default browser to debug with in Visual Studio 2008?

    http://stackoverflow.com/questions/297298/how-to-change-the-default-browser-to-debug-with-in-visual- ...

  10. 我想查看数据库名,输入命令:select name from v$database;为什么会说表和视图不存在

    你看一下你连接数据库的用户,需要有DBA权限才能看到这个表.