Создание отражения (сложение alpha каналов по умножению)
Хочу сделать эффект отражения картинки ( с альфа каналом)
Результат выглядит примерно вот так
[IMG]http://img502.**************/img502/2821/reflectionoq8.th.jpg[/IMG]
То есть отражением является перевёрнутая обрезанная картинка плавно исчезающая к низу.
У меня получилось реализовать только попиксельно, что довольно сильно тормозит при бальших отражениях.
Вопрос как сделать это более аппаратно ?
Вод код функции
Код:
// создать отражение
function CreateReflection()
{
// создаём Bitmap для будущего отражения
var myBitmapData:BitmapData = new BitmapData(m_picture._width, GLB_data.m_reflection_height);
myBitmapData.fillRect(new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),0x00000000);
// переворачиваем отражение
var matrix:Matrix = new Matrix();
matrix.scale(1,-1);
matrix.translate(0,m_picture._height);
// записываем в myBitmapData отражение
myBitmapData.draw(m_picture,matrix);
// теперь хотим сделать так, чтобы отражение исчезало по градиенту сверху вниз
// то есть по сути хотим умножить альфа канал отражения на затухающий градиент
//Alpha_Gradient_mc - это клип с градиентом от непрозрачного к прозрачному
var grad_clip = attachMovie("Alpha_Gradient_mc","grad",getNextHighestDepth());
var grad_matrix = new Matrix();
// подстраиваем градиент под правильный размер отражения
grad_matrix.scale(m_picture._width/grad_clip._width,GLB_data.m_reflection_height/grad_clip._height);
var grad_bitmap:BitmapData = new BitmapData(m_picture._width, GLB_data.m_reflection_height);
grad_bitmap.fillRect(new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),0x00000000);
grad_bitmap.draw(grad_clip,grad_matrix);
var color_transform:ColorTransform = new ColorTransform();
grad_matrix = new Matrix();
// эти закоментареные строки правильного результата не дали
//myBitmapData.draw(grad_bitmap,grad_matrix,color_transform,"multiply");
//myBitmapData.copyChannel(grad_bitmap, new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height), new Point(0, 0), 1, 8)
//myBitmapData.merge(grad_bitmap, new Rectangle(0, 0, m_picture._width, GLB_data.m_reflection_height),new Point(0, 0), 128, 0, 0, -255);
// попиксельная обработка хоть и даёт правильный результат, то уж больно тормозит
for(var i_x = 0;i_x<m_picture._width;i_x++)
{
for(var i_y = 0;i_y<GLB_data.m_reflection_height;i_y++)
{
var pict_color = myBitmapData.getPixel32(i_x,i_y);
var grad_color = grad_bitmap.getPixel32(i_x,i_y);
var alpha = (((pict_color>> 24 & 0xFF)) * ((grad_color>> 24) & 0xFF))/255;
//var alpha = ((grad_color>> 24) & 0xFF);
pict_color = pict_color & 0x00FFFFFF;
trace(alpha);
alpha = alpha << 24;
pict_color += alpha;
myBitmapData.setPixel32(i_x,i_y,pict_color);
}
}
grad_clip.removeMovieClip();
m_reflection.attachBitmap(myBitmapData, m_reflection.getNextHighestDepth(), "auto", true);
}
|