Macos 将CIImage渲染到IOSurface中的特定矩形

Macos 将CIImage渲染到IOSurface中的特定矩形,macos,opengl,opencl,core-image,Macos,Opengl,Opencl,Core Image,我试图通过将边界参数r指定为目标矩形,将CIImage渲染到IOSurface中的特定位置 根据文档,这应该是可行的,但CoreImage始终将图像渲染到IOSurface的左下角 在我看来,这就像CoreImage中的一个bug 我可以通过将图像渲染到与CIImage大小相同的中间IOSurface,然后将该曲面的内容复制到另一个曲面来克服这个问题。 但是,我希望避免解决方案中的分配和复制 有什么建议吗?你想发生的事情目前不可能用这个API实现,这是一个巨大的麻烦 但是,您可以使用CGLTex

我试图通过将边界参数r指定为目标矩形,将CIImage渲染到IOSurface中的特定位置

根据文档,这应该是可行的,但CoreImage始终将图像渲染到IOSurface的左下角

在我看来,这就像CoreImage中的一个bug

我可以通过将图像渲染到与CIImage大小相同的中间IOSurface,然后将该曲面的内容复制到另一个曲面来克服这个问题。 但是,我希望避免解决方案中的分配和复制


有什么建议吗?

你想发生的事情目前不可能用这个API实现,这是一个巨大的麻烦

但是,您可以使用CGLTexImageIOSurface2D将IOSurface包装为纹理,然后使用CIContext的contextWithCGLContext:…,最后使用drawImage:inRect:fromRect:执行此操作

这是一个巨大的黑客攻击,但它主要起作用:

您想要的是,当前不可能使用该API,这是一个巨大的麻烦

但是,您可以使用CGLTexImageIOSurface2D将IOSurface包装为纹理,然后使用CIContext的contextWithCGLContext:…,最后使用drawImage:inRect:fromRect:执行此操作

这是一个巨大的黑客攻击,但它主要起作用:

自macOS 10.13以来,您可以使用和获得相同的结果,而无需提供中间映像

在我的例子中,我使用金属和核心图像的组合,仅渲染输出图像的一个子部分,作为管道的一部分,如下所示:

let renderDst = CIRenderDestination(mtlTexture: texture, commandBuffer: commandBuffer)
try! context.startTask(toRender: ciimage,
                           from: dirtyRect, to: renderDst, at: dirtyRect.origin)
由于我已经在与MTLCommandBuffer同步,所以不需要与返回的CIRenderTask同步


如果您想了解更多详细信息,可以从83开始查看幻灯片。

自macOS 10.13以来,您可以使用并获得相同的结果,而无需提供中间图像

在我的例子中,我使用金属和核心图像的组合,仅渲染输出图像的一个子部分,作为管道的一部分,如下所示:

let renderDst = CIRenderDestination(mtlTexture: texture, commandBuffer: commandBuffer)
try! context.startTask(toRender: ciimage,
                           from: dirtyRect, to: renderDst, at: dirtyRect.origin)
由于我已经在与MTLCommandBuffer同步,所以不需要与返回的CIRenderTask同步


如果您想了解更多详细信息,可以从第83页开始查看幻灯片。

此解决方案对于按需渲染图像的小部分非常缓慢。主要是因为CoreImage可能会将数据从CGDataProvider复制到GPU,而且在这种情况下,它的自动缓存似乎不能很好地工作。此解决方案对于按需呈现图像的小部分非常缓慢。主要是因为CoreImage可能会将数据从CGDataProvider复制到GPU,而且在这种情况下,它的自动缓存似乎不能很好地工作。