我可以创建一个新的吗MTLTexture
尺寸w2/h2
现有的MTLTexture
region x1/y1/w1/h1
?
PS:我考虑过使用MTLTexture.buffer?.makeTexture
但偏移量需要是64字节。为什么?
以下是您可以如何执行此操作的示例MPSImageLanczosScale
。注意sourceRegion
以源纹理的像素坐标系表示,并且destRegion
应等于目标纹理的整个区域(请注意,它特别不考虑目标区域的原点):
let scaleX = Double(destRegion.size.width) / Double(sourceRegion.size.width)
let scaleY = Double(destRegion.size.height) / Double(sourceRegion.size.height)
let translateX = Double(-sourceRegion.origin.x) * scaleX
let translateY = Double(-sourceRegion.origin.y) * scaleY
let filter = MPSImageLanczosScale(device: device)
var transform = MPSScaleTransform(scaleX: scaleX, scaleY: scaleY, translateX: translateX, translateY: translateY)
let commandBuffer = commandQueue.makeCommandBuffer()
withUnsafePointer(to: &transform) { (transformPtr: UnsafePointer<MPSScaleTransform>) -> () in
filter.scaleTransform = transformPtr
filter.encode(commandBuffer: commandBuffer, sourceTexture: sourceTexture, destinationTexture: destTexture)
}
commandBuffer.commit()
commandBuffer.waitUntilCompleted()
如果需要读取 CPU 上的目标纹理,可以等到命令缓冲区完成,或者将完成的处理程序添加到命令缓冲区,以便在重采样工作完成时接收异步回调。否则,您可以在命令缓冲区中编码额外的工作并立即使用目标纹理。如果您要重复缩放纹理,则应该保留一个实例MPSImageLanczosScale
周围而不是重复创建它的实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)