2017-01-17 3 views
1

Ich habe Probleme mit dem zugrunde liegenden Speicher eines MPSImage zu arbeiten. Ich habe die Methoden getBytes und replace auf MPSImage texture Mitgliedsvariable verwendet, um die zugrunde liegenden Daten zu lesen und zu schreiben. Das Problem ist, dass ich keine Dokumentation darüber finden kann, wie der Speicher als Bild interpretiert wird (d. H. Wie die Zeilen, Spalten und Kanäle angeordnet sind). Ein Teil dessen, was das Problem verkompliziert, ist, dass unabhängig von der Anzahl der Feature-Channels die Daten als Stapel von RGBA-Textur-Slices gespeichert werden, wobei einige Kanäle möglicherweise nicht verwendet werden. Zum Beispiel wird es mit 3 Feature-Kanälen einen RGBA-Texturabschnitt geben, und der Platz eines Kanals bleibt ungenutzt.Apple Metal MPSImage Speicherlayout

Das Problem ist, wie sind die MPSImage Daten tatsächlich innerhalb der Textur angeordnet? Es erscheint komplizierter, als ich es ursprünglich vermutet hätte.

Nach vielen Experimenten scheint es, als ob die Daten unterschiedlich angeordnet sind, abhängig davon, ob die Anzahl der Feature-Kanäle < 4 oder> 4 ist. Aber ich habe immer noch Schwierigkeiten, es herauszufinden.

Kann mir jemand das MPSImage Datenlayout erklären?

Antwort

0

Die ersten vier Feature-Channels sind wie für eine Standard-RGBA-Textur codiert. Der Merkmalskanal 0 befindet sich in der "R" -Position, der Merkmalskanal 1 befindet sich in der "G" -Position und so weiter.

Die nächsten vier Feature-Kanäle sind als nächstes Segment in einem texture2d_array vorhanden. Wenn Sie ein 100x100-Bild mit 20 Feature-Kanälen haben, wird dies als ein 100x100-Textur-Array mit (20/4 =) 5 Schichten im Array codiert.

Um die Sache noch komplizierter zu machen, können Sie MPSImage-Arrays mit mehreren Bildern mit jeweils mehr als 4 Feature-Kanälen erstellen. Dies wird häufig als Batching bezeichnet. Das zweite Bild befindet sich im Textur-Array unmittelbar nach dem ersten Bild. Wenn wir mehrere 100x100x20 Bilder in dem MPSImage haben, dann beginnt der zweite bei Scheibe 5, der dritte bei Scheibe 10 und so weiter.