Проблема
Я впервые испытываю шейдеры производительности и столкнулся с проблемой во время выполнения.MTLTexture
, возвращаемое MTKTextureLoader
, кажется несовместимым с кодировщиком MPSImageFindKeypoints
Metal Performance Shaders.
На данный момент я обнаружил только подсказку из примера кода @ warrenm для MPS, который задает MTKTextureLoaderOptions
так же, как я сделал.Я не нашел никаких других упоминаний в документации.
Любая помощь высоко ценится.
Ошибка
/BuildRoot/Library/Caches/com.apple.xbs/Sources/MetalImage/MetalImage-121.0.2/MPSImage/Filters/MPSKeypoint.mm:166: failed assertion `Source 0x282ce8fc0 texture type (80) is unsupported
, где 0x282ce8fc0 - это MTLTexture
из загрузчика текстур,Насколько я мог видеть, нет типа MTLTexture 80, перечисление колеблется до 8 или около того (не шестнадцатеричное).
Код
CGFloat w = CGImageGetWidth(_image);
CGFloat h = CGImageGetHeight(_image);
id<MTLDevice> device = MTLCreateSystemDefaultDevice();
id<MTLCommandQueue> commandQueue = [device newCommandQueue];
NSDictionary* textureOptions = @{ MTKTextureLoaderOptionSRGB: [[NSNumber alloc] initWithBool:NO] };
id<MTLTexture> texture = [[[MTKTextureLoader alloc] initWithDevice:device] newTextureWithCGImage:_image
options:textureOptions
error:nil];
id<MTLBuffer> keypointDataBuffer;
id<MTLBuffer> keypointCountBuffer;
MTLRegion region = MTLRegionMake2D(0, 0, w, h);
id<MTLCommandBuffer> commandBuffer = [commandQueue commandBuffer];
MPSImageKeypointRangeInfo rangeInfo = {100,0.5};
MPSImageFindKeypoints* imageFindKeypoints = [[MPSImageFindKeypoints alloc] initWithDevice:device
info:&rangeInfo];
[imageFindKeypoints encodeToCommandBuffer:commandBuffer
sourceTexture:texture
regions:®ion
numberOfRegions:1
keypointCountBuffer:keypointCountBuffer
keypointCountBufferOffset:0
keypointDataBuffer:keypointDataBuffer
keypointDataBufferOffset:0];
[commandBuffer commit];
NSLog(keypointCountBuffer);
NSLog(keypointDataBuffer);
Редактировать
Послепреобразовывая мое изображение в правильный формат пикселей, я теперь инициализирую буферы следующим образом:
id<MTLBuffer> keypointDataBuffer = [device newBufferWithLength:maxKeypoints*(sizeof(MPSImageKeypointData)) options:MTLResourceOptionCPUCacheModeDefault];
id<MTLBuffer> keypointCountBuffer = [device newBufferWithLength:sizeof(int) options:MTLResourceOptionCPUCacheModeDefault];
Больше нет ошибок.Но как я могу читать содержимое сейчас?
((MPSImageKeypointData*)[keypointDataBuffer contents])[0].keypointCoordinate
возвращает (0,0) для всех индексов.Также я не знаю, как читать keypointsCountBuffer
.Содержимое буфера, преобразованное в значение типа int, показывает более высокое значение, чем определенные значения maxKeypoints.Я не вижу, где документы говорят, в каком формате находится буфер подсчета.