Есть ли какие-либо существенные различия между языком Metal Shader Language на iOS и Mac? Я пытаюсь портировать свои Metal cifilters с iOS, и они выглядят совсем по-другому
Есть ли различия между ядрами Metal на iOS и Mac?
Ответы (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
Хммм ... А есть ли способ преобразовать CIImage с полным поплавком в полудоплавающий?
- person David; 06.12.2019
Зачем вам это нужно?
- person Frank Schlegel; 06.12.2019
Я пытаюсь найти способ заставить существующие ядра Metal давать тот же результат, что и на iOS, без их перезаписи. Я думал, это может помочь.
- person David; 06.12.2019
Вот пример ядра для фильтра, который выполняет пикселизацию gist.github.com/Davvie/b481f715a0bdex а>
- person David; 06.12.2019
Например, изображение становится пиксельным с
paramIntensity = 20
на iOS, но почти не на Mac.
- person David; 06.12.2019
Вы сможете без проблем использовать это на iOS. Это просто максимальная точность значений пикселей, которая может отличаться на разных платформах. Но для большинства (цветных) операций 8 или 16 бит более чем достаточно.
- person Frank Schlegel; 06.12.2019
Понятно, значит, проблема в другом. В любом случае, спасибо
- person David; 06.12.2019
Ах, я думаю, что читал что-то о том, что
src.coord()
по умолчанию отличается на платформах: в iOS вы получаете относительные координаты (0 ... 1), тогда как в macOS это абсолютные координаты (0 ... ширина). У вас должна быть возможность отрегулировать это, изменив масштаб CISampler
, который вы передаете ядру с помощью параметра kCISamplerAffineMatrix
.
- person Frank Schlegel; 07.12.2019
Похоже, именно поэтому все разваливается. Однако применение преобразования, похоже, не помогает (выходное изображение становится 1 пикселем)
- person David; 09.12.2019
Это странно. Размер вывода должен определяться только параметром
extent
в вызове ядра. Разрешите продолжить свой ответ ...
- person Frank Schlegel; 09.12.2019