AdobeLabs PixelBender: отличная штука, но....

Что-то я анонс пропустил, а сегодня случайно наткнулся на Pixel Bender от Adobe Labs.

Казалось бы, отличная идея: пишешь шейдеры kernels на скриптовом языке, они исполняются на видеокарте или на CPU. Анонс тоже завлекал: дескать поддержвается любая разрядность цвета, все такое мультиплатформенное и хорошее. Есть плагин для Photoshop т.е. все изыски можно прямо в бою и использовать.

В-общем, я раскатал губу, скачал, поставил, закатал рукава и приготовился творить.

Для начала, тамошний инсталлятор отказался ставить 32-битный фотошопный плагин при наличии 64-битного. Это меня малость расстроило.

Из хорошего: штука работает, действительно можно писать kernels, работает быстро и как заказано. Как сделать что-то со сложным интерфейсом (с контролами примерно как у Lighting effects) - непонятно, а вот, например, параметрическую кривую (точнее, только параметры от нее) - запросто.

Из плохого: это все глубокая бета. Т.е. средства отладки отсутствуют, в редакторе скриптов есть кнопка Run но нет кнопки Stop (отчего видеокарта начинает жужжать вентилятором) и так далее. Документация, впрочем, кажется неплохой.

Из совсем плохого: в реальной жизни пользоваться пока нельзя.

Для начала, оно жрет картинки до 11-16 мегапикселей (самое большое что удалось запихать - квадратное изображение 4096x4096), на что-то большее ругается:

toolarge.png

Стандартный размер от моих 12-14-мегапиксельных камер скормить не удается, увы. При этом у меня видеокарта, пардон, с гигабайтом памяти (на одном GPU, а не в параллель), какая-то в этом месте фигня, ну не может быть нужно 64 байта на пиксель, я могу себе представить максимум 32 (4 float in и 4 float out). Попытка отключить видеокарту в настройках фотошопа - не помогла, ругается все так же.

Для окончания, несмотря на заявленную любую битность, фотошоповский плагин воспринимает только 8- и 16-битные RGB. Ни тебе CMYK, ни тебе Lab, ни тебе HDR.

А у меня было столько идей.... именно по подпиранию той функциональности, которой я уже пользуюсь, но есть она только для RGB, а хочется для Lab.

Comments

<i>какая-то в этом месте фигня, ну не может быть нужно 64 байта на пиксель</i>

Не в байтах дело. Хардверное ограничение на текстуру и thus на рендертаргет у нвидии - 4К по любому измерению. Понятное дело, что надо тайлить, но они (пока?) поленились.

Во блин. А в CUDA - 65k, отчего я на это ограничение никогда не наступал.

64к в том смысле что 2^16-1 конечно.

КУДА видимо тайлит, но непонятно тогда почему всего 64К? Ought to be enough for everybody?

О, нашел точные спеки (A.1.1 в CUDA Programming guide)

1-мерная текстура (bound to Cuda array) - макс размер 2^13
2-мерная - макс размеры 2^16 (ширина) x 2^15
3-мерная - 2^11x2^11^2^11
1-мерная bound to linear memory - 2^27 (никогда таким вариантом не пользовался, забыл даже что бывает такое)

Смысл в bound - попользоваться текстурным кэшем.

И я не думаю что там что-то тайлится, с чего бы? Просто проковыряна чуть другая дырочка к потрохам, которая не требует совместимости с предыдущими версиями.

С какими версиями? Все железки имеют разные размеры текстур, кто-то кило, кто-то два, кто-то четыре. Кто-то поддерживает квадрат, кто-то может и прямоугольник, кто-то теоретически прямоугольник поддерживает, но сосает. Это все ограничения железа, которые экспозятся либо через директиксовые капсы, либо через опенгльные расширения. Связаны, насколько я понимаю, с ограничениями текстурных интерполяторов.

Ну это CUDA capabilities 1.0 т.е. начиная с G80 и вверх. У более новых чипов-капабилитей это место не меняется.