J'essaie d'appliquer les filtres de la caméra en direct par le biais de métal en utilisant les paramètres par défaut. MPSKernal
filtres donnés par apple et custom compute Shaders
.
Dans le compute shader j'ai fait l'encodage inplace avec le MPSImageGaussianBlur. et le code va ici
func encode(to commandBuffer: MTLCommandBuffer, sourceTexture: MTLTexture, destinationTexture: MTLTexture, cropRect: MTLRegion = MTLRegion.init(), offset : CGPoint) {
let blur = MPSImageGaussianBlur(device: device, sigma: 0)
blur.clipRect = cropRect
blur.offset = MPSOffset(x: Int(offset.x), y: Int(offset.y), z: 0)
let threadsPerThreadgroup = MTLSizeMake(4, 4, 1)
let threadgroupsPerGrid = MTLSizeMake(sourceTexture.width / threadsPerThreadgroup.width, sourceTexture.height / threadsPerThreadgroup.height, 1)
let commandEncoder = commandBuffer.makeComputeCommandEncoder()
commandEncoder.setComputePipelineState(pipelineState!)
commandEncoder.setTexture(sourceTexture, at: 0)
commandEncoder.setTexture(destinationTexture, at: 1)
commandEncoder.dispatchThreadgroups(threadgroupsPerGrid, threadsPerThreadgroup: threadsPerThreadgroup)
commandEncoder.endEncoding()
autoreleasepool {
var inPlaceTexture = destinationTexture
blur.encode(commandBuffer: commandBuffer, inPlaceTexture: &inPlaceTexture, fallbackCopyAllocator: nil)
}
}
Mais parfois, la texture en place a tendance à échouer et finit par créer un effet de saccade sur l'écran.
Donc, si quelqu'un peut me suggérer la solution sans utiliser la texture in situ ou comment utiliser la fonction fallbackCopyAllocator
ou en utilisant le compute shaders
d'une manière différente, ce serait vraiment utile.