当前位置: 首页 > article >正文

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

在macOS的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代码,并进行加载即可。这些可以放在 - (void)setupContext 自定义方法中实现。

当然,在macOS中要使用OpenGL core profile必须引入 <OpenGL/gl3.h> 这个头文件。目前,3.2 core profile以及4.1 core profile都是用此头文件。


http://www.kler.cn/news/18545.html

相关文章:

  • Oracle监控账号创建【Prometheus】
  • webstorm 创建harthat项目
  • AI 工具合辑盘点(七)持续更新 之 AI 音乐制作工具
  • 【运动规划算法项目实战】如何利用AABB作碰撞检测(附ROS C++代码)
  • SQL学习日记
  • 从文字到语义:文本分词和词性标注的原理与实现
  • Gradio的web界面演示与交互机器学习模型,安装和使用《1》
  • 拐点已至!被比亚迪赶超,大众中国打响「翻身战」
  • 单元测试 - 集成H2 Dao测测试
  • 【Redis7】Redis7 持久化(重点:RDB与AOF重写机制)
  • 名称空间(namespaces)与作用域
  • [LeetCode周赛复盘] 第 344 场周赛20230507
  • 从不同视角来看待API数据接口
  • Unity用脚本获取物体和组件(下)
  • MySQL基础(三)基本的SELECT语句
  • eSIM证书要求-证书验证-EID
  • 第1章 Nginx简介
  • 187页9万字企业大数据治理与云平台实施方案(word)
  • sentinel 随笔 0-责任链
  • 俩小伙一晚上写了个 AI 应用,月入两万??(文末附开发教程)
  • Scrum敏捷开发工具-单团队敏捷开发管理
  • Linux用户空间与内核空间通信(Netlink通信机制)
  • 三种方法教你让模糊照片秒变高清图
  • 软件工程开发文档写作教程(05)—可行性研究报告写作规范
  • PBDB Data Service:Ecological and taphonomic vocabulary(生态学和埋葬学术语)
  • Ansys Lumerical | CMOS - 光学仿真方法
  • 一场面试下来,狂飙 Framework底层原理
  • 单链表OJ题:LeetCode--206.反转链表
  • Java之多线程初阶2
  • 【操作系统OS】学习笔记第三章 内存管理【哈工大李治军老师】