Macos 将CIImage渲染到IOSurface中的特定矩形
我试图通过将边界参数r指定为目标矩形,将CIImage渲染到IOSurface中的特定位置 根据文档,这应该是可行的,但CoreImage始终将图像渲染到IOSurface的左下角 在我看来,这就像CoreImage中的一个bug 我可以通过将图像渲染到与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
有什么建议吗?你想发生的事情目前不可能用这个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,而且在这种情况下,它的自动缓存似乎不能很好地工作。