ios - 裁剪和缩放 MTLTexture

标签 ios metal

我可以创建一个新的 MTLTexture 尺寸 w2/h2 现有 MTLTexture 区域 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 实例,而不是重复创建它的实例。

关于ios - 裁剪和缩放 MTLTexture,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40970644/

相关文章:

macos - 如何将位图纹理的每个像素渲染到 macOS 上屏幕的每个 native 物理像素?

ios - 如何为移动应用创建后端

macos - 无法使用 Apple 的 Metal Graphics API 进行深度测试

objective-c - 更改CAMetalLayer背景颜色

ios - 触摸移动 UIButton

scenekit - SceneKit 中 Metal 生成的网格

ios - 从字符串中提取 NSDecimalNumber 以及其中的字符

iOS:如何知道邮件帐户是否存在

html - 是否可以在iOS Safari中同时播放2个在线视频?