如何使用 Swift 在 NSOpenGLView 中绘制图像?

2024-03-23

基本上,我想创建一个使用 OPenGL 进行渲染的 ImageView。我的最终计划是使用它作为带有 CIFilters 的视频播放器的基础。

我关注了一个tutorial https://github.com/objcio/core-image-video/blob/master/CoreImageVideo/CoreImageView.swift其中强调使用OpenGL技术来充分利用GPU。该教程适用于 iOS。我将它映射到可可。

我不知道我哪里失败了,但我得到的只是一个空白屏幕。

这是视图。

import Cocoa
import OpenGL.GL3

class CoreImageView: NSOpenGLView {
    var coreImageContext: CIContext?
    var image: CIImage? {
        didSet {
            display()
        }
    }

    override init?(frame frameRect: NSRect, pixelFormat format: NSOpenGLPixelFormat?) {
        //Bad programming - Code duplication
        let attrs: [NSOpenGLPixelFormatAttribute] = [
            UInt32(NSOpenGLPFAAccelerated),
            UInt32(NSOpenGLPFAColorSize), UInt32(32),
            UInt32(NSOpenGLPFAOpenGLProfile),
            UInt32( NSOpenGLProfileVersion3_2Core),
            UInt32(0)
        ]
        let pf = NSOpenGLPixelFormat(attributes: attrs)
        super.init(frame: frameRect, pixelFormat: pf)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        initialize()
    }

    //Bad programming - Code duplication
    func defaultPixelFormat()->NSOpenGLPixelFormat?{
        let attrs: [NSOpenGLPixelFormatAttribute] = [
            UInt32(NSOpenGLPFAAccelerated),
            UInt32(NSOpenGLPFAColorSize), UInt32(32),
            UInt32(NSOpenGLPFAOpenGLProfile),
            UInt32( NSOpenGLProfileVersion3_2Core),
            UInt32(0)
        ]
        return NSOpenGLPixelFormat(attributes: attrs)
    }

    func initialize(){

        guard let pf = defaultPixelFormat() else {
            Swift.print("pixelFormat could not be constructed")
            return
        }
        self.pixelFormat = pf

        guard let context = NSOpenGLContext(format: pf, share: nil) else {
            Swift.print("context could not be constructed")
            return
        }
        self.openGLContext = context

        if let cglContext = context.cglContextObj {
            coreImageContext = CIContext(cglContext: cglContext, pixelFormat: pixelFormat?.cglPixelFormatObj, colorSpace: nil, options: nil)
        }else{
            Swift.print("cglContext could not be constructed")
            coreImageContext = CIContext(options: nil)
        }
    }

    //--------------------------

    override func draw(_ dirtyRect: NSRect) {
        if let img = image {
            let scale = self.window?.screen?.backingScaleFactor ?? 1.0
            let destRect = bounds.applying(CGAffineTransform(scaleX: scale, y: scale))
            coreImageContext?.draw(img, in: destRect, from: img.extent)
        }
    }

}

任何帮助表示赞赏。完整的项目是这里(XCode 8) https://dl.dropboxusercontent.com/u/62559842/CoreImageExercise.zip and 这里(Xcode 7) https://dl.dropboxusercontent.com/u/62559842/CoreImageExerciseX7.zip


我可能建议查看 Simon 的 Core Image 帮助程序——他在他的 github 上有这个东西,它基本上告诉核心图像使用 OpenGLES 2.0 上下文通过 GPU 进行渲染。当我试图弄清楚如何通过 GPU 渲染时,这对我来说确实很有帮助——不传输到 CPU 进行渲染是一个非常好的主意,因为传输需要很长时间(相对)。

https://github.com/FlexMonkey/CoreImageHelpers https://github.com/FlexMonkey/CoreImageHelpers

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Swift 在 NSOpenGLView 中绘制图像? 的相关文章

  • 领域:结果 和列表

    是否可以转换Results
  • WiFi 网络变化是否有 NSNotificationCenter 通知?

    我想在我的 Cocoa 应用程序中订阅 WiFi 网络更改 但我无法找到合适的事件来订阅 WiFi 网络变化是否有 NSNotificationCenter 通知 据我所知 我会用CoreWLAN https developer apple
  • 具有动态警报正文的快速本地通知

    所以我可以创建一个像这样的本地通知 var localNotification UILocalNotification localNotification fireDate NSDate timeIntervalSinceNow 7 loc
  • 如何检测 swiftui 中是否存在键盘

    我想知道按下按钮时键盘是否存在 我该怎么做 我已经尝试过 但我没有任何运气 谢谢 使用该协议 KeyboardReadable 你可以符合任何View并从中获取键盘更新 KeyboardReadable协议 import Combine i
  • 如何去掉 UIWebView 上的状态栏背景?

    从 iOS 11 开始 当UIWebView全屏时 状态栏上会出现与屏幕颜色相同的假背景UIWebView背景 有人知道如何摆脱它吗 甚至添加IUWebView到故事板并使其全屏将使状态栏背景出现 我一直在尝试编辑 UIWebView 的大
  • 我们能否检测用户是否通过主页按钮或锁定按钮离开而没有监听 darwin 通知?

    我最近向应用程序商店提交了一个新的二进制文件并将其发送以供审核 但它立即被拒绝并显示以下消息 不支持的操作 不允许应用程序监听设备锁定通知 经过一番挖掘后 我发现我们无法使用 com apple springboard lockstate
  • 如何在可编写脚本的应用程序中将任意 AppleScript 记录传递给 Cocoa?

    我有一个 Cocoa 应用程序 其中包含 sdef XML 文件中描述的 AppleScript 字典 sdef 中定义的所有 AppleScript 类 命令等都是工作属性 除了我的 提交表单 命令 提交表单 命令是我尝试将任意信息哈希表
  • AWS S3 公共对象与私有对象?

    回到 S3 我的存储桶中有图像的 URL 我将在我的应用程序中呈现这些图像 但它们被设置为私有 当我尝试单击该链接时 它显示 访问被拒绝 当我将链接的设置更改为公共时 它会通过 但是我读到公共访问并不是最安全的事情 所以这本质上是一个由两部
  • 从 cocoa 编辑系统偏好设置

    有没有办法使用可可以编程方式编辑系统首选项 是否需要一些框架 我需要这样做来更改全局代理设置 另外 我的应用程序是沙盒的 有关于如何执行此操作的示例代码吗 感谢您的帮助 您正在寻找系统配置框架 但这并不容易 我认为沙盒应用程序不可能这样做
  • iOS 电池监控 Swift

    我已将监控设置为启用 但模拟器和设备中的电池电量仍然为 1 UIDevice currentDevice batteryMonitoringEnabled true var level UIDevice currentDevice batt
  • 设置/覆盖 UICollectionView 中单元格之间的填充

    我有一个 UICollectionView 但在获取单元格之间的填充时遇到了问题 理论上 我应该能够将屏幕除以 4 并且我可以获得包含 4 个图像的单元格大小 完美地占据屏幕宽度 但是 它选择不这样做 相反 它会创建 3 个具有巨大填充的图
  • 当 UITextField 已满或空时显示警报 Swift

    下面的代码中 如果 userNameTF 或 passwordTF 已满或为空 则会显示警报 IBAction func LoginBtn sender AnyObject let userName userNameTF text let
  • 使用 NSError 检查错误的正确结构

    我正在编写各种例程 并尽力保持其整洁和重构 我正在创建的方法开始看起来与此代码类似 IBAction buttonPress id sender Create Document Shopping List with this documen
  • 所需框架与静态库

    构建现代框架 https developer apple com videos play wwdc2014 416 says 每个应用程序都有自己的自定义框架副本 https stackoverflow com a 15262463 242
  • 为什么这个谓词格式会变成 '= nil'

    有人建议这个线程 https stackoverflow com questions 40686005 nspredicate crash after swift 3 migration与我的问题完全相同 但是 我的应用程序没有崩溃 并且我
  • SKNode 上的 runAction 未完成

    我使用 NSOperation 子类来获取串行执行SKAction正如这个问题中所描述的 如何在 Swift 中子类化 NSOperation 以将 SKAction 对象排队以进行串行执行 https stackoverflow com
  • 我可以/如何用 RC3 替换我的 KVO 东西?

    我正在尝试将一个使用 Facebook 的 KVOController 的 objc 应用程序移植到 Swift 我被鼓励去看看RC3 https github com ReactiveCocoa ReactiveCocoa作为一种替代且更
  • 存储 OpenGL 状态

    假设我正在尝试用 C 制作某种小型 opengl 图形引擎 我读过通过访问 opengl 状态glGet 函数可能非常昂贵 虽然访问 opengl 状态似乎是一个经常操作 并且强烈建议将 opengl 状态的副本存储在具有快速读 写访问权限
  • 如何自动缩放mapView以显示叠加层

    我可以在 mapView 上绘制多边形 但是我需要找到多边形并手动缩放它 有没有办法自动执行此过程 例如调整中心多边形 我浏览过互联网并阅读了一些相关文章 其中大多数都是基于折线和点的 任何形式的帮助将不胜感激 因为我正在寻找解决方案一段时
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码

随机推荐