我试图在图像中的一些像素上执行一些逻辑。目前,我正在使用CGImage的蛮力方法,它看起来像这样:
for y in 0 ..< cgImage.height {
for x in 0 ..< cgImage.width {
if x == 20 && y == 300 {
//TODO: Change pixel color to clear color.
}
}
}
然而,这种方法超级慢,我希望在Swift Metal中做类似的事情来提高性能。在Swift Metal中,我不知道如何在函数中获得特定像素的索引。Thread_position_in_grid只返回网格中线程的x和y。是否有办法确定当前像素的X和Y被操作?
这是金属功能,我试图创建和转换从使用CGImage循环到金属GPU处理:
kernel void black (texture2d<float, access::read> inTexture [[texture(0)]],
uint2 id [[thread_position_in_grid]]) {
if (id.x == 20 && id.y == 300){
//TODO: Change pixel color to clear color.
}
}
决定把这个也贴出来。如果不是,我很乐意删掉。
kernel vec4 clearColorPixel (sampler image) {
vec2 coord = destCoord();
if (coord.x == 20. && coord.y == 300.) {
// TODO: change pixel to clear color
}
}
虽然我主要不使用金属或纹理,但似乎您正在使用CPU将uint2 id
传递到内核。简单地传递像素。这对我来说效果很好,而且不是很慢。