#swift #cgimage #metalkit
Вопрос:
Я пытаюсь выполнить некоторую логику для некоторых пикселей внутри изображения. В настоящее время я использую подход грубой силы с CGImage, который выглядит примерно так:
for y in 0 ..< cgImage.height {
for x in 0 ..< cgImage.width {
if x == 20 amp;amp; y == 300 {
//TODO: Change pixel color to clear color.
}
}
}
Однако этот подход очень медленный, и я надеялся сделать что-то подобное в Swift Metal, чтобы повысить производительность. В Swift Metal я не могу понять, как получить индекс определенного пикселя в функции. thread_position_in_grid возвращает мне только x и y потока в сетке. Есть ли в любом случае способ определить X и Y текущего обрабатываемого пикселя?
Вот функция metal, которую я пытаюсь создать и преобразовать с помощью цикла CGImage в обработку металлического графического процессора:
kernel void black (texture2d<float, access::read> inTexture [[texture(0)]],
uint2 id [[thread_position_in_grid]]) {
if (id.x == 20 amp;amp; id.y == 300){
//TODO: Change pixel color to clear color.
}
}
Комментарии:
1. Публикую в качестве комментария, потому что это не металл, но это должно сработать. Похоже, вы слишком много делаете на стороне процессора. Когда вы используете общую функцию ядра, почему бы просто не получить доступ
destCoord()
? Он уже там, чтобы дать вам то, что вам нужно. (Я делаю это регулярно, и это не очень медленно.)
Ответ №1:
Решил также опубликовать это в качестве ответа. Если это не так, я с радостью удалю это.
kernel vec4 clearColorPixel (sampler image) {
vec2 coord = destCoord();
if (coord.x == 20. amp;amp; coord.y == 300.) {
// TODO: change pixel to clear color
}
}
Хотя я не работаю в основном с металлом или текстурами, похоже, что вы используете процессор для передачи в uint2 id
свое ядро. Просто передайте пиксель. Это хорошо работает для меня и не очень медленно.
Комментарии:
1. Мне очень нравится ваш ответ, к сожалению, я все еще новичок в использовании функций GPU и MetalKit. Я пытался понять, как работают пробоотборники в MetalKit и как получить координаты destCoords из переданного пробоотборника, но для меня работа все еще продолжается. Я буду обновлять эту тему по мере того, как буду продвигаться в ней, так как сейчас я голосую за ответ. Спасибо вам за помощь.