我对 Metal 很陌生,但正在努力遵循 Apple 的规定AVCam滤镜 https://developer.apple.com/documentation/avfoundation/cameras_and_media_capture/avcamfilter_applying_filters_to_a_capture_stream示例项目。该项目演示了使用 MTKView 作为 AVCaptureSession 的预览。
我一直未能成功弄清楚如何让我的 MTKView 呈现“全屏”(特别是在 iPhone X、XS 和第三代 iPad Pro 上)。虽然我的约束在故事板中设置正确,但我的相机预览缩放为不同的宽高比,而不是全屏。
作为测试,我设置;
self.clearColor = MTLClearColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
在我的 MTKView 的 init 中,确认 MTKView 的大小正确(我可以在有问题的区域看到红色背景,但我的相机预览不会拉伸以填充屏幕)。
我相信我的问题存在于这个计算中;
// Calculate scale.
if textureWidth > 0 && textureHeight > 0 {
switch textureRotation {
case .rotate0Degrees, .rotate180Degrees:
scaleX = Float(internalBounds.width / CGFloat(textureWidth))
scaleY = Float(internalBounds.height / CGFloat(textureHeight))
case .rotate90Degrees, .rotate270Degrees:
scaleX = Float(internalBounds.width / CGFloat(textureHeight))
scaleY = Float(internalBounds.height / CGFloat(textureWidth))
}
}
// Resize aspect ratio.
resizeAspect = min(scaleX, scaleY)
if scaleX < scaleY {
scaleY = scaleX / scaleY
scaleX = 1.0
} else {
scaleX = scaleY / scaleX
scaleY = 1.0
}
在我的测试环境中,我的纹理大小是 2400x1800,我的内部边界是 834x1194。虽然我认识到宽高比的差异,但我正在尝试找出正确的数学方法,使纹理填充整个显示器(即使这意味着它的缩放比例稍小并且我丢失了侧面的一些纹理)。
有人可以建议吗?谢谢!
// Resize aspect ratio.
resizeAspect = min(scaleX, scaleY)
if scaleX < scaleY {
scaleY = scaleX / scaleY
scaleX = 1.0
} else {
scaleX = scaleY / scaleX
scaleY = 1.0
}
用。。。来代替
// Resize aspect ratio.
// For AspectFill Screen scaleX > scaleY
// For AspectFit Screen scaleX < scaleY
resizeAspect = min(scaleX, scaleY)
if scaleX > scaleY {
scaleY = scaleX / scaleY
scaleX = 1.0
} else {
scaleX = scaleY / scaleX
scaleY = 1.0
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)