我试图使用CIImage将边界参数r指定为目标矩形,从而将IOSurface中的特定位置呈现为[CIContext render:toIOSurface:bounds:colorSpace:]。
根据文档,这应该可以工作,但是CoreImage总是将图像呈现到IOSurface的左下角。
在我看来,这就像是CoreImage中的一个bug。
我可以通过将图像呈现到具有相同大小的IOSurface的中间CIImage,然后将表面的内容复制到另一个表面,从而解决这个问题。然而,我想避免在解决方案中的分配和复制。
有什么建议吗?
发布于 2014-02-09 21:44:38
您想要发生的事情目前在API中是不可能的(这是一个巨大的障碍)。
但是,您可以将IOSurface包装为纹理(使用CGLTexImageIOSurface2D),然后使用CIContext的contextWithCGLContext:…,然后最后使用drawImage:inRect:fromRect:来完成此操作。
这是一次巨大的黑客攻击,但(主要是):https://github.com/ccgus/FMMicroPaintPlus/blob/master/CIMicroPaint/FMIOSurfaceAccumulator.m
发布于 2019-06-18 21:39:46
由于macOS 10.13,您可以使用CIRenderDestination和CIContext.startTask(toRender:from:to:at:)实现相同的结果,而不必提供中间映像。
在我的例子中,我使用了的组合来只呈现输出映像的一个子部分,作为管道的一部分,如下所示:
let renderDst = CIRenderDestination(mtlTexture: texture, commandBuffer: commandBuffer)
try! context.startTask(toRender: ciimage,
from: dirtyRect, to: renderDst, at: dirtyRect.origin)由于我已经在与MTLCommandBuffer同步,所以不需要与返回的CIRenderTask同步。
如果您想了解更多细节,可以查看核心图像的进展:过滤器,金属,视觉和更多(WWDC视频从2017年开始)的幻灯片(从83开始)。
https://stackoverflow.com/questions/21652199
复制相似问题