繁体   English   中英

如何调整 MTLTexture 的大小/缩放

[英]How to resize/scale an MTLTexture

我有一个 MTLTexture,它是它出现的 MTLView 的大小。但是,我正在将纹理写入AVAssetWriterInputPixelBufferAdaptor以记录需要纹理为标准视频大小(即 1280x720)的视频。

目前我正在使用MTLRegionMake2D指定纹理中要提取的区域。 在宽度较长的手机上,裁剪的效果并不明显。 但是在形状和尺寸更方形的 iPad 上,裁剪很明显。 理想情况下,我会先将纹理调整为与视频相同的宽度或高度,然后裁剪其余部分(而不是仅仅裁剪)。

调整 MTLTexture 大小的适当方法是什么?

示例代码:

guard let pixelBufferPool = assetWriterPixelBufferInput.pixelBufferPool else { return }

var maybePixelBuffer: CVPixelBuffer? = nil
let status  = CVPixelBufferPoolCreatePixelBuffer(nil, pixelBufferPool, &maybePixelBuffer)
if status != kCVReturnSuccess { return }

guard let pixelBuffer = maybePixelBuffer else { return }

CVPixelBufferLockBaseAddress(pixelBuffer, [])
let pixelBufferBytes = CVPixelBufferGetBaseAddress(pixelBuffer)!

let bytesPerRow = CVPixelBufferGetBytesPerRow(pixelBuffer)
let region = MTLRegionMake2D(0, 0, Int(videoSize.width), Int(videoSize.height))

texture.getBytes(pixelBufferBytes, bytesPerRow: bytesPerRow, from: region, mipmapLevel: 0)

let frameTime = CACurrentMediaTime()
let presentationTime = CMTimeMakeWithSeconds(frameTime, 240)
assetWriterPixelBufferInput.append(pixelBuffer, withPresentationTime: presentationTime)

CVPixelBufferUnlockBaseAddress(pixelBuffer, [])

最后我使用MPSImageLanczosScale来缩放纹理,见:

苹果文档: https://developer.apple.com/documentation/metalperformanceshaders/mpsimagelanczosscale

示例: 裁剪和缩放 MTLTexture

重新缩放后,我仍然需要使用一个区域来裁剪剩余部分。 我有一些逻辑来检测纵向/横向,以及平板电脑或手机来确定合适的作物。 在我的情况下(对于纵向),我选择垂直居中用于裁剪顶部/底部的瘦设备(手机),以及水平居中裁剪左/右的宽设备(平板电脑)。 对景观有类似的逻辑,但相反。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM