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, ,
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的更多相关文章
- vs for Mac中的启用Entity Framework Core .NET命令行工具
在vs for Mac的工具菜单中已没有了Package Manager Console. 我们可以通过以下方法使用Entity Framework Core .NET命令行工具: 1.添加Nuget ...
- 网页中如何启用QQ交谈
很多网友都会发现好多的网页中会有诸如,网页中如何启用QQ交谈? 1. 登录QQ, 打开网址:http://shang.qq.com/v3/widget.html 启用QQ通讯组件. 2. 选择组件样式 ...
- 在Mac OS X 10.8中配置Apache + PHP + MySQL
在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apache 配置PHP 安装MySQL 配置PHPAdmin 设置数据库默认字符集 一. 配置Apache 1. ...
- Windows 8.1中怎么启用Framework3.5或2.0 ( 一安装就跳到下载 Win8.1自带了Framework)
Windows 8.1中怎么启用Framework3.5或2.0 ( 一安装就跳到下载 Win8.1自带了Framework): Win+X键 打开 开始菜单 -> 命令提示符(管 ...
- 【Xamarin挖墙脚系列:关闭 OS X El Capitan 中 SIP 安全设置功能】
比如需要修改内核配置文件: com.apple.Boot.plist 那么我们需要解锁权限. 禁止SIP模式,那么就可以修改此文件了. 在 OS X El Capitan 中有一个跟安全相关的模式叫 ...
- 在Mac OS X 10.8中配置Apache+PHP+MySQL
在Mac OS X 10.8中配置Apache+PHP+MySQL的内容包括: 配置Apache 配置PHP 安装MySQL 配置PHPAdmin 设置数据库默认字符集 一. 配置Apache 1. ...
- OS X 和iOS 中的多线程技术(上)
OS X 和iOS 中的多线程技术(上) 本文梳理了OS X 和iOS 系统中提供的多线程技术.并且对这些技术的使用给出了一些实用的建议. 多线程的目的:通过并发执行提高 CPU 的使用效率,进而提供 ...
- OS X 和iOS 中的多线程技术(下)
OS X 和iOS 中的多线程技术(下) 上篇文章中介绍了 pthread 和 NSThread 两种多线程的方式,本文将继续介绍 GCD 和 NSOperation 这两种方式.. 1.GCD 1. ...
- OS X 10.11 中的安全删除文件
在 OS X 10.11 中安全倾倒垃圾桶这个功能已经被取消了.是因为 SSD 闪存硬盘的原因 . 安全删除操作并不能安全清除. 所以就直接取消了. 但是其实其实还是可以在系统内使用安全删除功能的. ...
随机推荐
- Image Processing and Analysis_8_Edge Detection:Learning to Detect Natural Image Boundaries Using Local Brightness, Color, and Texture Cues ——2004
此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...
- storedownloadd占用cpu高
禁用App Store的自动更新
- Paper Reading:Faster RCNN
Faster R-CNN 论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 发表时间: ...
- WCF Endpoint分类
WCF中可以为一个Service配置多个Endpoint 这些Endpoint的分类方法有下面3中 1.全局就一个endpoint,一个接口公开所有的方法,这适合简单的业务场景 2.将endpoint ...
- 收藏!了解UART总线工作原理看这一篇就够了!
原文:玩转单片机 2019-08-24 16:50:29 越学到后面,基础知识更加不能忘记,温故而知新~~ 还记得当年的打印机,鼠标和调制解调器吗?他们都有巨大笨重的连接器和粗电缆,并且必须拧到你的电 ...
- BZOJ 3903 反垄断 (最大流推的结论题)
题目 中文题目,不解释: BZOJ传送门 分析 这道题BZOJ上也只有几个人过-奇怪了 下面是正解 原问题为一个二分图边染色问题.首先考虑最好情况.最理想情况的分配为:设一个点xxx的度为dgr(x) ...
- learning express stpe(三)
use static resourceL: const express = require('express'); const app = express(); app.use(express.sta ...
- Java进阶知识22 Spring execution 切入点表达式
1.概述 切入点(execution ):可以对指定的方法进行拦截,从而给指定的类生成代理对象.(拦截谁,就是在谁那里切入指定的程序/方法) 格式: execution(modifiers-pat ...
- Java Collection Framework 备忘点
最顶端是两个接口,集合和映射—— Collection<T> / Map<K, V> List 列表 保持插入顺序 ArrayList 擅长随机读 LinkedList ...
- 第二章、URL与资源
1 URL统一资源定位符 URL 是浏览器寻找信息时所需的资源位置.通过 URL,人类和应用程序才能找到.使用并共享因特网上大量的数据资源.URL是作为URI的一个子集,URI是一类更通用的资源标识符 ...