Конференция "Игры" » Как пользоваться AddBlend в FastDIB? [Delphi, Windows]
 
  • Валера (01.05.12 14:43) [0]
    Есть переменная Bk: TFastDIB это фоновый рисунок
    Есть переменная Img: TFastDIB это другой рисунок.

    Нужно вывести Img с блендингом в режиме Add.


    Canvas.FillRect(Canvas.ClipRect); // Чистим.
    FBack.Draw(Canvas.Handle, 0, 0); // Выводим фон.

    AddBlend(FImg, FBack, FBack); // Что тут?

    FImg.AlphaDraw(Canvas.Handle, X, Y, 175, False); // Рисуем.


  • Sapersky (01.05.12 19:49) [1]
    Создаётся буфер-TFastDIB, в него рисуется фон, картинки AddBlend-ом или чем-то аналогичным, потом буфер выводится на канвас (DC).
    http://sapersky.narod.ru/files/AddBlendTest.rar
  • Валера (02.05.12 18:14) [2]
    Без разницы, в моем примере можно выводить без посторонних буфферов.

    Как вывести 1 изображение на другое в режиме AddBlend-а?
    Там 3 параметра, что каждый означает?

    procedure AddBlend(Dst,Src1,Src2:TFastDIB);
  • Sapersky (03.05.12 01:23) [3]
    Src - source - откуда
    Dst - destination - куда
    Для большей универсальности источника два, но в принципе один из Src может быть равен Dst.
  • Валера (03.05.12 01:33) [4]
    Почему то не получается:


    AddBlend(Back, Img, Back);
    Img.AlphaDraw(Canvas.Handle, X, Y, 175, False);



    Должно вывести полупрозрачное изображение, которое стало немного ярче.
    Что не так?
  • Sapersky (03.05.12 12:25) [5]
    Я ж говорю, первый параметр - куда рисовать. Ты рисуешь в Back, а выводишь Img.
    Для повышения яркости есть более простые методы, FastFX.Addition/Lightness, или просто увеличить коэфф. альфы при выводе.
  • Валера (03.05.12 20:42) [6]
    > Sapersky   (03.05.12 12:25) [5]


    > Src - source - откуда
    > Dst - destination - куда
    > Для большей универсальности источника два, но в принципе
    > один из Src может быть равен Dst.


    > Я ж говорю, первый параметр - куда рисовать. Ты рисуешь
    > в Back, а выводишь Img.


    Получается 2 варианта:


     AddBlend(Back, Img, Img);
     AddBlend(Back, Img, Back);

     Img.Draw(Form1.Canvas.Handle, X, Y);



    И не одни из них не работает как нужно.


    > Для повышения яркости есть более простые методы, FastFX.
    > Addition/Lightness


    Эти 2 варинта тоже не работают:
    Изображение становится белесым, а не как при Add-блендинге.


     Addition(Img, 60, 60, 60);
     Lightness(Img, 60, 60, 60);

  • Валера (03.05.12 20:46) [7]
    Мне нужно, чтобы была вот такая простая функция:


    procedure DrawAlpha(DC; HDC; Dib: TFastDib; Mode: TBlendMode);




    Это как в Flash AS3, можно выставить режим блендинга (add) и выводить с полупрозрачностью и все прекрасно.
  • Sapersky (04.05.12 10:30) [8]
    На DC могут выводить только системные функции, TFastDIB.Draw/AlphaDraw - это обёртки над ними. При этом системные функции умеют максимум обычный альфа-блендинг (если брать только GDI, хотя есть ещё GDI+ и Direct2D).
    AddBlend и пр. - собственные функции фастлиба, работают с пикселями на низком уровне и могут рисовать только на TFastDIB, в крайнем случае, в область памяти.
    Поэтому, как я уже писал в [1], чтобы "всё было прекрасно" и можно было рисовать как хочется - создаём промежуточный буфер, рисуем в него фастлибовскими функциями, потом выводим буфер на DC. Если каких-то функций не хватает, дописываем самостоятельно.
    Так работают с любой пользовательской библиотекой (Graphics32, AggPas). Не нравится - смотри системные, но там если чего-то нет - самому уже не дописать.

    В твоём случае, возможно, достаточно заранее подготовить более яркую версию картинки. Но как конкретно повышать яркость - я уже не понимаю, сложить картинку с собой (умножить на 2), что ли? Ну попробуй тогда AddBlend(Img, Img, Img). Или в дополнение к Addition/Lightness добавь контраста (Contrast).
    Если нужно "вот прям как во флэше" - смотри документацию по флэшу, может быть, там есть формулы для режимов блендинга.
  • Валера (04.05.12 18:01) [9]
    > AddBlend(Img, Img, Img)

    Помогло, но оно не настраиваемое

    > Addition
    > Contrast

    Помогло.

    Описание "ADD":
    http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/flash/display/DisplayObject.html#blendMode
  • Валера (04.05.12 18:08) [10]

    procedure DrawAlpha(DC: HDC; X, Y: LongInt; Dib: TFastDIB; Alpha: byte);
    const
     ADD_FACTOR = 85;
    var
     Tmp: TFastDIB;

     procedure _Add(Value: LongInt);
     begin
       Addition(Tmp, Value, Value, Value);
       Contrast(Tmp, Value, Value, Value);
     end;

    begin
     Tmp:= TFastDIB.Create;
     try
       Tmp.MakeCopy(Dib, True);
       _Add(ADD_FACTOR);
       Tmp.AlphaDraw(DC, X, Y, Alpha, False);
     finally
       Tmp.Free;
     end;
    end;


  • Валера (04.05.12 18:17) [11]

    procedure DrawAlpha(DC: HDC; X, Y: LongInt; Dib: TFastDIB; Alpha: byte);
    const
     ADD_FACTOR = 85;
    var
     Tmp: TFastDIB;

     procedure Add;
     var
       Lut: TLut;
     begin
       Lut:= AdditionLut(ADD_FACTOR);
       ApplyLut(Tmp, Lut, Lut, Lut);

       Lut:= ContrastLut(ADD_FACTOR);
       ApplyLut(Tmp, Lut, Lut, Lut);
     end;

    begin
     Tmp:= TFastDIB.Create;
     try
       Tmp.MakeCopy(Dib, True);
       Add;
       Tmp.AlphaDraw(DC, X, Y, Alpha, False);
     finally
       Tmp.Free;
     end;
    end;

  • Sapersky (04.05.12 20:58) [12]
    Ещё можно сначала сложить LUT'ы (MergeLuts), потом применить результирующий к картинке. Должно быть несколько быстрее.
  • Валера (04.05.12 21:15) [13]

    > Sapersky


    Жму руку, спасибо что помог. :)
 
Конференция "Игры" » Как пользоваться AddBlend в FastDIB? [Delphi, Windows]
Есть новые Нет новых   [134427   +38][b:0][p:0.002]