Есть ли различия между ядрами Metal на iOS и Mac?

Есть ли какие-либо существенные различия между языком Metal Shader Language на iOS и Mac? Я пытаюсь портировать свои Metal cifilters с iOS, и они выглядят совсем по-другому


person David    schedule 06.12.2019    source источник


Ответы (1)


Да, не должно быть разницы между платформами на уровне языков.

Одно различие, о котором я могу думать, заключается в том, что macOS поддерживает изображения с 32-битными изображениями на канал («полное» с плавающей запятой), тогда как в iOS вы можете «только» использовать 16-битные половинные плавающие изображения.

Еще одно отличие, которое только что пришло в голову, - это стандартное координатное пространство входных сэмплеров. В iOS пространство сэмплера находится в относительных координатах ([0...1]), тогда как в macOS оно находится в абсолютных координатах ([0...width]). Вы должны иметь возможность унифицировать это поведение, явно задав такую ​​матрицу сэмплера (в macOS):

// see documentation for `kCISamplerAffineMatrix`
let scaleMatrix = [1.0/inputImage.extent.width, 0, 0, 1.0/inputImage.extent.height, 0, 0]
let inputSampler = CISampler(image: inputImage, options: [kCISamplerAffineMatrix: scaleMatrix])
kernel.apply(extent: domainOfDefinition, roiCallback: roiCallback, arguments: [inputSampler, ...])
person Frank Schlegel    schedule 06.12.2019
comment
Хммм ... А есть ли способ преобразовать CIImage с полным поплавком в полудоплавающий? - person David; 06.12.2019
comment
Зачем вам это нужно? - person Frank Schlegel; 06.12.2019
comment
Я пытаюсь найти способ заставить существующие ядра Metal давать тот же результат, что и на iOS, без их перезаписи. Я думал, это может помочь. - person David; 06.12.2019
comment
Вот пример ядра для фильтра, который выполняет пикселизацию gist.github.com/Davvie/b481f715a0bdex а> - person David; 06.12.2019
comment
Например, изображение становится пиксельным с paramIntensity = 20 на iOS, но почти не на Mac. - person David; 06.12.2019
comment
Вы сможете без проблем использовать это на iOS. Это просто максимальная точность значений пикселей, которая может отличаться на разных платформах. Но для большинства (цветных) операций 8 или 16 бит более чем достаточно. - person Frank Schlegel; 06.12.2019
comment
Понятно, значит, проблема в другом. В любом случае, спасибо - person David; 06.12.2019
comment
Ах, я думаю, что читал что-то о том, что src.coord() по умолчанию отличается на платформах: в iOS вы получаете относительные координаты (0 ... 1), тогда как в macOS это абсолютные координаты (0 ... ширина). У вас должна быть возможность отрегулировать это, изменив масштаб CISampler, который вы передаете ядру с помощью параметра kCISamplerAffineMatrix. - person Frank Schlegel; 07.12.2019
comment
Похоже, именно поэтому все разваливается. Однако применение преобразования, похоже, не помогает (выходное изображение становится 1 пикселем) - person David; 09.12.2019
comment
Это странно. Размер вывода должен определяться только параметром extent в вызове ядра. Разрешите продолжить свой ответ ... - person Frank Schlegel; 09.12.2019