【问题标题】:Using EAGLContext with CIContext on MacOS在 MacOS 上使用 EAGLContext 和 CIContext
【发布时间】:2016-11-02 18:33:18
【问题描述】:

我有一个简单的 Swift 命令行 MacOS 应用程序,我正在努力设置 EAGLContext:

let openGLContext = EAGLContext(API: .OpenGLES3)
let context = CIContext(EAGLContext: openGLContext)

上面的代码给了我:

Use of unresolved identifier 'EAGLContext'

无论我加载什么模块:

import CoreImage
import OpenGL
import QuartzCore
import GLKit

现在的问题是:CIContext 默认使用 OpenGL 渲染吗?

当我在没有任何选项的情况下初始化一个新的CIContext 时:

let context = CIContext()

并将环境变量 CI_PRINT_TREE 设置为 1 控制台输出给我:

initial graph image_get_cgimage (opengl context 1 frame 1)
                                 ^^^^^^^^^^^^^^^^^^^^^^^^

所以它确实在 GPU 上下文中处理我的过滤器,对吧?有没有办法显式设置 GPU 渲染或者 GPU 是默认上下文?

【问题讨论】:

    标签: swift swift3 core-image


    【解决方案1】:

    According to Docs

    有一种方法可以在 CPU 或 GPU 上显式初始化 CIContext

    你也可以指定 Metal 或 OpenGL

    为基于 CPU 的渲染创建上下文

    init(cgContext: CGContext, options: [String : Any]? = nil)
    

    从 Quartz 上下文创建一个 Core Image 上下文,使用 指定的选项。

    使用 OpenGL 为基于 GPU 的渲染创建上下文:

    init(cglContext: CGLContextObj, pixelFormat: CGLPixelFormatObj?, colorSpace: CGColorSpace?, options: [String : Any]? = nil)
    

    使用指定的从 CGL 上下文创建核心图像上下文 选项、色彩空间和像素格式对象。

    init(eaglContext: EAGLContext)
    

    从 EAGL 上下文创建核心图像上下文。

    init(eaglContext: EAGLContext, options: [String : Any]? = nil)
    

    使用指定的从 EAGL 上下文创建核心图像上下文 选项。

    init?(forOfflineGPUAt: UInt32)
    

    使用非 GPU 创建基于 OpenGL 的核心图像上下文 当前正在驱动显示器。

    init?(forOfflineGPUAt: UInt32, colorSpace: CGColorSpace?, options: [String : Any]? = nil, sharedContext: CGLContextObj?)
    

    使用非 GPU 创建基于 OpenGL 的核心图像上下文 当前正在使用指定的选项驱动显示器。

    使用 Metal 为基于 GPU 的渲染创建上下文

    init(mtlDevice: MTLDevice)
    

    使用指定的 Metal 设备创建 Core Image 上下文。

    init(mtlDevice: MTLDevice, options: [String : Any]? = nil)
    

    使用指定的 Metal 设备创建 Core Image 上下文,并 选项。

    【讨论】:

    • 是的,我熟悉文档。问题仍然悬而未决:如果我没有明确指定,为什么要使用空初始化器CIContext() 在 OpenGL 上下文中处理图像?
    • @Pono 我认为这是问题“所以它确实在 GPU 上下文中处理我的过滤器,对吗?有没有办法显式设置 GPU 渲染或者 GPU 是默认上下文?”跨度>
    • @Pono 好吧,我想它将默认设置为 GPU,因为所有“CI”东西都是专门为启用 GPU 处理图像而构建的。我同意它在 Docs 中没有明确指出,但是我对此类另一个问题更感兴趣“为什么是 OpenGL 而不是 Metal?”
    • Metal 在性能方面优于 OpenGL 有哪些优势?
    • @Pono Metal 被宣传为更高效,因为它是 GPU 特定的层,这意味着它内部的代码膨胀更少,并且可以受益于最新的 GPU 优化(因为它不必支持所有Apple 平台上旧的和/或不存在的 GPU)。 TLDR 在我使用 Metal 的游戏中,我可以绘制两倍于 OpenGL 的可动画 3D 对象,当然这是在我的特定情况下的具体示例 -> 但对我来说它是这样工作的 -> 我认为它说明了一些东西 :) Apple 也以糟糕的 OpenGL 实现而闻名至少在 Mac 中
    【解决方案2】:

    刚刚在 Apple 文档here 中找到了答案:

    使用自动上下文渲染

    如果您对自己的应用与其他应用的互操作方式没有限制 图形技术,创建核心图像上下文很简单:只需 使用基本的 initinitWithOptions: 初始化程序。当你这样做时, Core Image 在内部自动管理资源,选择 基于适当或最佳可用的 CPU 或 GPU 渲染技术 在当前设备和您指定的任何选项上。

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-09
      相关资源
      最近更新 更多