Я создаю график MPS, состоящий из одного узла конкатенации:
auto node = [MPSNNConcatenationNode nodeWithSources:sourceNodes];
auto graph = [MPSNNGraph graphWithDevice:device
resultImage:resultNode
resultImageIsNeeded:YES];
и кодирую его:
auto resultImage = [graph encodeToCommandBuffer:cmdBuffer
sourceImages:sourceImages];
(другой код на самом деле не имеет значения, поэтому я его опускаю )
sourceImages
выглядит следующим образом:
Printing description of sourceImages:
<__NSArrayM 0x604000059150>(
<MPSImage: 0x60f000003010> ""
device: 0x61d00003fc80 "AMD Radeon RX 5700 XT"
width: 3
height: 4
featureChannelsPerImage: 2
numberOfImages: 1
MTLPixelFormat: MTLPixelFormatRG32Float
feature channel format: MPSImageFeatureChannelFormatFloat32
parent: 0x0
texture: 0x606000043d00
,
<MPSImage: 0x60f000003010> ""
device: 0x61d00003fc80 "AMD Radeon RX 5700 XT"
width: 3
height: 4
featureChannelsPerImage: 2
numberOfImages: 1
MTLPixelFormat: MTLPixelFormatRG32Float
feature channel format: MPSImageFeatureChannelFormatFloat32
parent: 0x0
texture: 0x606000043d00
)
Я ожидал получить изображение, состоящее из одной 2D текстуры с featureChannelsPerImage
, равным 4. Это будет идеально соответствовать MTLPixelFormatRGBA32Float
.
Однако resultImage
выглядит следующим образом:
Printing description of resultImage:
<MPSImage: 0x60f0000031f0> ""
device: 0x61d00003fc80 "AMD Radeon RX 5700 XT"
width: 3
height: 4
featureChannelsPerImage: 8
numberOfImages: 1
MTLPixelFormat: MTLPixelFormatRGBA32Float
feature channel format: MPSImageFeatureChannelFormatFloat32
parent: 0x0
texture: 0x606000044c60
Документация класса говорит, что на самом деле это правильное поведение:
Поскольку все изображения дополняются Для кратных четырем характерным каналам M, N и O здесь также кратны четырем, даже если MPSImages нет. То есть, если изображение состоит из 23 характерных каналов и одного канала заполнения, в объединенном результате оно занимает пространство, равное 24 характерным каналам.
Я мог бы использовать resultImage
, но не могу см. способ восстановления информации о количестве каналов в каждом срезе массива.
Таким образом, вопрос состоит в том, как объединить 2 или более MPSImage
s в «действительный» MPSImage
(состоящий из обычного 2D-текстура или 2D-массив текстур)?