我試圖通過金屬使用默認MPSKernal
過濾器通過蘋果和自定義compute Shaders
應用實時相機過濾器。如何使用自定義計算着色器使用金屬並獲得非常流暢的性能?
在計算着色器,我做了就地編碼與MPSImageGaussianBlur 和代碼放在這裏
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)
}
}
但有時就地質地往往失敗,並最終在屏幕上創建一個挺舉效果。
所以,如果任何人都可以建議我解決方案,而不使用就地紋理或如何使用fallbackCopyAllocator
或使用compute shaders
在一個真正有用的不同方式。
你爲什麼在命令編碼器上調用'blur' _after_ call'endEncoding()'? –
@MatthijsHollemans我使用命令編碼器將流水線狀態編碼爲GPU可理解的語言。這是通過創建** MTLLibrary **並創建一個函數,然後創建一個流水線狀態來編碼**命令編碼器**來完成的。命令編碼器的目的是設置進程的狀態(在這種情況下將計算着色器編碼到GPU)。完成編碼後,告訴GPU它已準備好將其編碼到GPU。謝謝。等待建議。 –
我的不好,我誤解了你的代碼。 –