Soy muy nuevo en Metal, pero trabajo diligentemente para seguir el proyecto de muestra AVCamFilter de Apple. El proyecto demuestra el uso de MTKView como vista previa de AVCaptureSession.
No he logrado descubrir cómo hacer que mi MTKView se reproduzca en "pantalla completa" (específicamente en iPhone X, XS y iPad Pro de tercera generación). Si bien mis restricciones están configuradas correctamente en el guión gráfico, la vista previa de mi cámara se escala a una relación de aspecto diferente y no a pantalla completa.
Como prueba, puse;
self.clearColor = MTLClearColor(red: 1.0, green: 0.0, blue: 0.0, alpha: 1.0)
en el inicio de mi MTKView, confirmando que el MTKView tiene el tamaño adecuado (puedo ver el fondo rojo en las áreas problemáticas, pero la vista previa de mi cámara no se estira para llenar la pantalla).
Creo que mi problema existe en este cálculo;
// 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 }En mi entorno de prueba, el tamaño de mi textura es 2400x1800 y mis límites internos son 834x1194. Si bien reconozco la diferencia en la relación de aspecto, estoy tratando de averiguar las matemáticas correctas para que la textura llene toda la pantalla (incluso si eso significa que se escala un poco menos y pierdo parte de la textura en los lados).
¿Alguien podría aconsejar? ¡Gracias!
// Resize aspect ratio. resizeAspect = min(scaleX, scaleY) if scaleX < scaleY { scaleY = scaleX / scaleY scaleX = 1.0 } else { scaleX = scaleY / scaleX scaleY = 1.0 }Reemplazar con
// 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 }Open PreviewMetalView.swift Replace following lines: let width = CVPixelBufferGetWidth(previewPixelBuffer) let height = CVPixelBufferGetHeight(previewPixelBuffer) with following lines: let previewViewWidth = Int(self.frame.size.width) let previewViewheight = Int(self.frame.size.height) let isPortrait = previewViewheight > previewViewWidth let width = isPortrait ? previewViewheight : previewViewWidth let height = isPortrait ? previewViewWidth : previewViewheight