在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都是用此头文件。

最新文章

  1. Java工程师成神之路
  2. Java正则表达式入门——转自RUNOOB.COM
  3. 通过style控制圆形imageView显示
  4. phonegap之android原生日历调用
  5. 洛谷P3379 【模板】最近公共祖先(LCA)
  6. Google C++ 风格指南 命名约定 转
  7. tomcat绿色版及安装版修改内存大小的方法
  8. 推荐一款不错的dialog小工具:artDialog
  9. 剖析MFC六大关键技术(五六)--消息映射与命令传递
  10. HttpClient方式调用接口的实例
  11. CentOS 安装 Docker
  12. SpringCloud(7)服务链路追踪Spring Cloud Sleuth
  13. spark总结
  14. mysql之我们终将踩过的坑(优化)
  15. Springboot杂七杂八
  16. stingray前端架构总体设计及运行过程
  17. Jetty安装配置
  18. 用 Love2D 实现法线贴图的例程(到最新版本 0.10.1)
  19. Can&#39;t connect to local MySQL server through socket &#39;/var/lib/mysql/mysql.sock&#39;
  20. 第7天:javascript-DOM 获取标签、注册事件改变属性的值、innerText、改变属性的值等

热门文章

  1. CSS浮动特性
  2. H5中的requestAnimationFrame
  3. 凌乱的yyy / 线段覆盖(贪心)
  4. gdb设置条件断点
  5. nginx 重发机制导致的重复扣款问题
  6. js获取链接?后边的参数名称或者值
  7. Python----常用的__doc__、__name__、__file__的使用
  8. Java集合--Vector
  9. 如何实现UI自动化?DevExpress Winforms帮你忙
  10. python 图像识别的小应用