裁剪和缩放MTLTexture

我可以创build一个现有MTLTexture区域x1/y1/w1/h1的尺寸为w2/h2的新MTLTexture吗?

PS:我想过使用MTLTexture.buffer?.makeTexture但偏移量需要为64个字节。 为什么?

下面是一个如何使用MPSImageLanczosScale做这个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上的目标纹理,则可以等待命令缓冲区完成,或者在完成重新采样工作时向命令缓冲区添加完成的处理程序以接收asynchronouscallback。 否则,可以将其他工作编码到命令缓冲区中,并立即使用目标纹理。 如果要反复缩放纹理,则应该保留MPSImageLanczosScale的单个实例,而不是重复创build它的实例。