Недавно я реализовал симуляцию воды в металле, используя буфер для пинг-понга и вычислительные шейдеры. Это работает хорошо, но мне просто интересно, какова будет стоимость замены текстур несколько раз за кадр и можно ли это улучшить, используя Blit Command Encoder?
Вот пример кода:
let computeEncoder = commandBuffer.makeComputeCommandEncoder()!
computeEncoder.setComputePipelineState(pipelineState)
computeEncoder.setTexture(textureA, index: 0)
computeEncoder.setTexture(textureB, index: 1)
var width = pipelineState.threadExecutionWidth
var height = pipelineState.maxTotalThreadsPerThreadgroup / width
let threadsPerThreadGroup = MTLSizeMake(width, height, 1)
width = Int(textureA.width)
height = Int(textureA.height)
let threadsPerGrid = MTLSizeMake(width, height, 1)
computeEncoder.dispatchThreads(threadsPerGrid, threadsPerThreadgroup: threadsPerThreadGroup)
computeEncoder.endEncoding()
swap(&textureA, &textureB)