我能否在现有的MTLTexture
区域x1/y1/w1/h1
上创建一个新的尺寸为w2/h2
的MTLTexture
?
注:我考虑使用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
实例,而不是反复创建它的实例。
MPSImageScale
的唯一原因是当时它还不存在。 - warrenmwithUnsafePointer
在 validateComputeFunctionArguments:829
处失败了,断言失败:'Compute Function(lanczosHorizontalScale):写入纹理(dest[1]),其用途(0x01)未指定MTLTextureUsageShaderWrite (0x02)'。 - JCutting8textureDescriptor.usage = [.shaderRead, .shaderWrite]
。 - JCutting8MPSImageScale
不能直接使用,因为它是一个抽象类。具体的类为 MPSImageLanczosScale
和 MPSImageBilinearScale
。
MPSImageLanczosScale
内核。 - warrenm