Да, стало лучше. Я тут потыкался, вроде получилось еще круче, только правда пара настроек добавилась - 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
}
}
Может сможешь еще как-то прокачать...
Ах да, у меня в Бендере не пишется по-русски — надеюсь разберешься, что я там нашлепал в комментах
