Создание пикселя преобразовывает

FxPlug 2.0 представил вызванный пиксель нового понятия, преобразовывает. Пиксельное преобразование является матрицей преобразования, дающей больше информации плагину FxPlug о том, как вычислить расположение в текстуре (или битовый массив), который соответствует определенной точке в изображении. С этой новой информацией плагин можно попросить представить меньше пикселей, позволив ему и хост-приложение работать более эффективно.

Пиксельные преобразования являются 4 x 4 матрицы, создающиеся узлом для содержания информации, такой как вращение, масштаб и видение в перспективе носителей, плагину применились к. Например, когда пользователь выбирает разрешение прокси в Движении или среднее качество в Final Cut Pro, эта информация содержится в пикселе, преобразовывают. Аналогично, когда узел просит, чтобы Ваш плагин представил маленький предварительный просмотр миниатюры, масштабирование содержится в пикселе, преобразовывают. Обратите внимание на то, что пиксельное преобразование не является полной матрицей преобразования того, где уровень расположен в сцену. Для той информации необходимо использовать Fx3DAPI. Пиксель преобразовывает, вместо этого содержит или полную или частичную информацию о том, как изображение ввода или вывода искажено прежде чем быть составленным в сцену.

Когда уровень параллелен фильму назад виртуальной киносъемки сцена, Вы могли бы видеть все ее пиксели как показано на рисунке 7-1.

  Уровень рисунка 7-1 параллелен к фильму назад виртуальной камеры

Поскольку самая эффективная текстура для генератора для создания является той, соответствующей точно пикселям, необходимым в заключительном составе, хороший пиксель преобразовывают для использования (если плагин может поддерживать его), тот, который располагают с интервалами проекты от объектного пространства уровня до вывода сцены. Когда пользователь поворачивает уровень вокруг оси X и панорамирует его назад на оси z, это испытывает недостаток вдоль своей ширины, как показано на рисунке 7-2.

  Уровень рисунка 7-2 вращался об оси y

Это дает плагину возможность обработать меньше пикселей, потому что меньше будут представлены.

Поддержка пикселя преобразовывает

Каждый плагин выбирает, какая информация, о которой он должен знать через пиксель, преобразовывает и позволяет узлу знать, с какими типами преобразований он будет иметь дело. Это делает это включением надлежащей пары ключ/значение в словаре, который это возвращает из его метода свойств. Значение, включенное в словарь, говорит хост-приложение, с какими типами трансформаций плагин способен к работе.

Плагины, работающие в более старых версиях Движения и Final Cut Pro, должны уже быть способны к поддержке неоднородного масштабирования. Это масштабирование всегда требовалось для обработки вещей, таких как поля, неквадратные пиксели, генерация миниатюры и рендеринг разрешения прокси.

В дополнение к обработке неоднородного масштабирования плагин может предложить поддержку масштабирования с переводом, масштабирующимся и с переводом и с вращением, любым аффинным преобразованием (включая сдвиг), или любая полная перспектива преобразовывает.

Плагины, отмеченные как Независимый Пиксель, могут обработать полную перспективу, преобразовывает, потому что каждый выходной пиксель полагается только на единственный входной пиксель, и расположение каждого входного пикселя не влияет на рендеринг плагина. Это обычно преобразования цвета, такие как преобразование в шкалу полутонов, корректировка гаммы, контраста или яркости или смещения оттенка ввода.

Для информирования хост-приложения, какие типы пикселя преобразовывают сменные поддержки он должен включать kFxPropertyKey_PixelTransformSupport введите словарь, возвращенный -properties метод. Значение ключа должно быть одной из следующих констант в FxImage класс.

enum FxPixelTransformSupport {
    kFxPixelTransform_Scale,
    kFxPixelTransform_ScaleTranslate,
    kFxPixelTransform_Full
};


If плагин не включает этот ключ properties словарь, хост-приложение предполагает, что поддерживает трансформации масштаба. Все плагины должны поддерживать, по крайней мере, масштаб, преобразовывает.

Типичное -properties метод мог бы быть похожим на следующее:

- (NSDictionary*)properties
{
    return [NSDictionary dictionaryWithObjectsAndKeys:
        [NSNumber numberWithInt:kFxPixelTransform_Scale],
        kFxPropertyKey_PixelTransformSupport,
        nil];
}

Используя пиксель преобразовывает

После того, как Ваш плагин говорит хост-приложение, какие типы трансформаций он может использовать, он должен использовать пиксель, преобразовывает соответственно для рендеринга. Это обычно принимает форму того, чтобы просить, чтобы входное изображение для его пикселя преобразовало, и/или его обратный пиксель преобразовывают, с помощью FxImage методы класса pixelTransform и inversePixelTransform. После того, как у Вас будут эти матрицы трансформации, Вы используете их в программе построения теней фрагмента своего плагина или растровом методе рендеринга.

При рендеринге в аппаратных средствах Вы знаете текущую координату текстуры каждой входной текстуры. Аналогично, при рендеринге в программном обеспечении, Вы знаете координату каждого пикселя, работать на. Для рендеринга должным образом необходимо передать текущую координату через обратный пиксель, преобразовывают. Результатом является координата, представляющая текущий пиксель, если изображение было в квадратных пикселях, не преобразованных, и в полном разрешении. Это - координата, на которой Вы хотите сделать свою математику для искажений, ядер свертки, и т.д. После того, как Вы сделали свою математику на Ваших координатах, выполнял их через прямой пиксель, преобразовывают для получения координаты, от которой Вы выбираете входное изображение. (В случае генератора можно пропустить этот последний шаг, потому что нет никакого входного изображения.)

Следующее является простым выходным методом рендеринга:

(BOOL)renderOutput:(FxImage*)outputImage
        withInput:(FxImage*)inputImage
        withInfo:(FxRenderInfo)renderInfo
{
    // Get the forward and inverse pixel tarnsforms
    FxMatrix44*    pixelTrans    = [inputImage pixelTransform];
    FxMatrix44* invPixelTrans = [inputImage inversePixelTransform];
    FxBitmap*    inBitmap    = (FxBitmap*)inputImage;
    FxBitmap*    outBitmap    = (FxBitmap*)outputImage;
    …
    
    UInt32    x,y;
    for (y = 0; y < [outputImage height]; y++)
    {
        float*    dst    = (float*)((UInt8*)[outBitmap dataPtr] +
            (y * [outBitmap rowBytes]));
        for (x = 0; x < [outputImage width]; x++)
        {
            // Convert the current coordinate into full-sized
            // square pixels
            FxPoint2D    coord = {x, y};
            coord = [invPixelTrans transform2DPoint:coord];
            
            // Do some distortion math here - 
            // produce a sine wave distortion
            coord.x += amplitude * sin (coord.y / wavelength);
            
            // Convert from full-sized square pixels into the
            // space of the image we actually have
            coord = [pixelTrans transform2DPoint:coord];
            
            //sample from input
            SInt32    newX    = (UInt32)floor (coord.x);
            SInt32    newY    = (UInt32)floor (coord.y);
            if ((0 <= newX) && (newX < [inputImage width]))
            {
                float*    src    = (float*)((UInt8*)[inBitmap dataPtr] + 
                    (newY * [inBitmap rowBytes]) + (newX * sizeof (float) * 4));
                *dst++ = *src++;    // alpha
                *dst++ = *src++;    // red
                *dst++ = *src++;    // green
                *dst++ = *src++;    // blue
    
            }
            else
            {
                *dst++ = 0;
                *dst++ = 0;
                *dst++ = 0;
                *dst++ = 0;
            }
        }
    }
}

Вышеупомянутый пример запускается путем получения прямого и обратного пикселя изображения ввода, преобразовывает. Эти преобразования позволяют ему преобразовывать текстуру (или битовый массив) координаты в полноразмерные координаты квадратного пикселя, в которых обычно выводится на экран изображение. В том пространстве метод может выполнить вычисления на координатах (например, выполнив искажения). Если Вы хотите исказить пиксели вдоль синусоидальной волны или отодвинуть пиксели от определенной точки в изображении, необходимо работать в квадратных пикселях в полном разрешении для получения корректных результатов для всех типов видеозаписи во всех условиях просмотра. Аналогично, если Вы хотите выбрать многократные места во входном изображении для создания размытости или другого ядра свертки, необходимо расположить выборки с интервалами соответственно, независимо от попиксельной пропорции, использования полей или разрешения просмотра.

После того, как требуемая математика на Ваших координатах завершается, значения должны быть преобразованы назад в пространство, в котором пиксели изображения находятся фактически. Вы делаете это путем передачи координат через прямой пиксель преобразовывает. Теперь можно безопасно выбрать от изображения и знать, что Вы получите требуемый результат.

Некоторые примеры

Следующее является некоторыми типичными примерами пикселя, преобразовывает, Вы, вероятно, будете видеть в фактическом использовании. Если пользователь создаст проект, который является проектом квадратного пикселя и применяет некоторую видеозапись размера проекта к холсту — довольно типичному случаю — то пиксельное преобразование будет единичной матрицей, как будет обратный пиксель преобразовывать как показано в рисунок 7-3.

Полагайте  , что преобразование на 7-3 пикселя и Обратный пиксель преобразовывают матрицы

Если пользователь тогда устанавливает разрешение просмотра холста в полуразрешение, Вы видите, что отразился в пикселе, преобразовывают, как показано на рисунке 7-4.

Рисунок 7-4  , который пиксель Половинного размера преобразовывает и обратный пиксель, преобразовывает матрицы

Если Вам применились к фильтру видеозапись, имеющая попиксельную пропорцию 1,33, Вы видите, что в пикселе преобразовывают, как показано на рисунке 7-5.

Полагайте  , что аспект на 7-5 пикселей 1,33 преобразовывает, и обратный пиксель преобразовывают матрицы

Если Вы делаете надлежащее использование пикселя, преобразовывает в Ваш код рендеринга, у Вас не должно быть кода особого случая для миниатюр или разрешения прокси, и Вы не должны масштабировать ни один из своих параметров. Ваш рендеринг будет “просто работать” на все эти ситуации.