今度はPixelBenderでトイカメラっぽいレンズ特性を再現するフィルターを作ってみました。


今回、トイカメラっぽさを出すために再現したレンズ特性は
周辺光量低下色収差です。



周辺光量低下は、写真の周りが暗くなってしまう現象で、
トイカメラのレンズなんかでよく見られる現象です。

こちらを再現するために、特定の点からの距離が、ある特定の値を超えた場合、
距離に従って徐々に明るさを減らす処理を入れました。


色収差は、光がレンズを通過するときの屈折率が波長によって変わることで起こる、
色の分解のようなものです。

こちらを再現するために、一度、ソース画像を、赤緑青の色要素に分解し、
拡大率を変えて再度重ねました。



サンプルです。
右下のボタンをポチっとするとオンオフを切り替えられます。




リアルの撮影では、上記のような特性をなるべく抑えるようなレンズを利用しますが
あえて安いレンズの特性を再現することで、無機質なモーショングラフィックが
味のある感じになった気がしますネ!

フィルターコチラからダウンロードいただけます。


パラメータ

//レンズの中心座標
    shader.data.center.value = [200.0, 150.0];
//色収差の強さ
    shader.data.aberration.value = [1.05];
//周辺減光のサイズ
    shader.data.dim_size.value = [150];
//周辺減光の強さ
    shader.data.dim_strength.value = [0.8];

こんな感じで設定


PBKソース

< languageVersion : 1.0; >

kernel OldLens
<   namespace : "";
    vendor : "Kousho Shimada";
    version : 1;
    description : "chroma aberration/limb darkening filter";
>
{
    input image4 src;
    output pixel4 dst;
    
    parameter float2 center
    <
        minValue:float2(0.0);
        maxValue:float2(2800.0);
        defaultValue:float2(200.0);
    >;
    parameter float aberration
    <
        minValue:1.0;
        maxValue:1.2;
        defaultValue:1.0;
    >;
    parameter float dim_strength
    <
        minValue:0.0;
        maxValue:1.0;
        defaultValue:0.0;
    >;
    parameter float dim_size
    <
        minValue:0.0;
        maxValue:1000.0;
        defaultValue:200.0;
    >;

    
    void
    evaluatePixel()
    {
        float2 pos = outCoord();
        float2 delta = pos - center;
        float dist = distance(pos, center);
        float aberration_g = (aberration - 1.0) / 2.0 + 1.0;
        pixel4 pr = sampleLinear(src, center + delta / aberration);
        pixel4 pg = sampleLinear(src, center + delta / aberration_g);
        pixel4 pb = sampleLinear(src, pos);
        
        float dim = 1.0;
        if(dist > dim_size * 0.8)
        {
            dim = 1.0 - (dist - dim_size * 0.8) / (dim_size * 0.8) * dim_strength;
        }
        else if(dist > dim_size)
        {
            dim = 1.0 - dim_strength;
        }
        
        dst = pixel4(pr.r * dim, pg.g * dim, pb.b * dim, 1.0);
    }
}


こんな感じです

 

 

HTML5飯