Тема: Chroma Keying?
Показать сообщение отдельно
Старый 05.12.2010, 08:36
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 6  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Да, стало лучше. Я тут потыкался, вроде получилось еще круче, только правда пара настроек добавилась - addAlpha и addAlphaRank. Не знаю как назвать по-человечески.. Просто когда тыкался, то там действительно с альфой связано было, а потом все закрутилось-завертелось... так что хз как и обозвать
colorMult и colorOffset - это для контроля за альфа каналом, чтобы можно было посмотреть не вырезаются ли дыры там, где не надо.
Вот примеры:

женщина на сцене (оригинал, на розовом фоне, на разноцветном фоне):
http://d.imagehost.org/0118/01a.jpg
http://b.imagehost.org/0410/01b.jpg
http://b.imagehost.org/0106/01c.jpg

Джессика:
http://b.imagehost.org/0241/02a.jpg
http://d.imagehost.org/0335/02b.jpg
http://d.imagehost.org/0248/02c.jpg

Птичка:
http://b.imagehost.org/0582/03a.jpg
http://d.imagehost.org/0512/03b.jpg
http://d.imagehost.org/0579/03c.jpg

Пати:
http://d.imagehost.org/0575/04a.jpg
http://d.imagehost.org/0916/04b.jpg
http://d.imagehost.org/0422/04c.jpg

И самое главное - практически отсутствует зеленоватый цвет. Даже в отражениях полная тон-компенсация.

Вот код:
Код:
<languageVersion : 1.0;>

kernel GreenscreenKeying
<
    namespace : "ChromaKeying";
    vendor : "Vadim BELLinSKY feat. i.o.";
    version : 4;
    description : "Greenscreen keying with edge color correction";
>
{

    parameter float enableBackground
    <
        minValue:       float(0.0);
        maxValue:       float(1.0);
        defaultValue:   float(0.0);
    >;
    
    parameter float amount
    <
        minValue:       float(0.0);
        maxValue:       float(10.0);
        defaultValue:   float(1.0);
    >;
    
    parameter float threshold
    <
        minValue:       float(0.0);
        maxValue:       float(1.0);
        defaultValue:   float(1.0);
    >;
    
    parameter float addAplha
    <
        minValue:       float(0.00);
        maxValue:       float(0.50);
        defaultValue:   float(0.10);
    >;
    
    parameter float addAplhaRank
    <
        minValue:       float(0.00);
        maxValue:       float(10.0);
        defaultValue:   float(1.7);
    >;
    
    parameter float colorSupression
    <
        minValue:       float(0.00001);
        maxValue:       float(2.0);
        defaultValue:   float(0.00001);
    >;
    
    parameter float colorMult
    <
        minValue:       float(0.0);
        maxValue:       float(+10.0);
        defaultValue:   float(1.0);
    >;
    
    parameter float colorOffset
    <
        minValue:       float(-1.0);
        maxValue:       float(+1.0);
        defaultValue:   float(0.0);
    >;
    
    input image4 src;
    output pixel4 dst;

    void evaluatePixel()
    {
        dst = sampleNearest( src, outCoord() );

        // calc a key-color match
        float A = clamp( 1.0 + amount * (dst.r + dst.b - dst.g * (1.0 + threshold)), 0.0, 1.0 );
        // calc a mask value
        float mask = pow( addAplha + A, addAplhaRank );
        
        // supress key-color (green)
        dst.g += ( 0.33*(dst.r + dst.b) - 0.66*dst.g ) * pow( 1.0 - A, colorSupression );
        // apply mask value
        dst.a *= mask;
        // clamp color
        dst = clamp( dst, 0.0, 1.0 );
        
        //{ helping calcs
        dst.r *= colorMult;
        dst.g *= colorMult;
        dst.b *= colorMult;
        //
        dst.r += colorOffset;
        dst.g += colorOffset;
        dst.b += colorOffset;
        //
        dst = clamp( dst, 0.0, 1.0 );
        //
        float4 bgColor = float4( 0.5 + 0.5 * sin( 0.25 * outCoord().x ) * cos( 0.50 * outCoord().y ),
                                 0.5 + 0.5 * cos( 0.50 * outCoord().x ) * sin( 0.25 * outCoord().y ),
                                 1.0,
                                 1.0 );

        if( enableBackground > 0.5 )
        {
            dst = mix( dst, bgColor, 1.0 - dst.a );
        }
        //} helping calcs

    }
}
Может сможешь еще как-то прокачать...
Ах да, у меня в Бендере не пишется по-русски — надеюсь разберешься, что я там нашлепал в комментах


Последний раз редактировалось i.o.; 05.12.2010 в 11:09.