Конференция "Media" » Полупрозрачность
 
  • NaRuTo © (20.04.08 20:21) [0]
    Как осуществить полупрозрачность:
    Я использовал алгоритм полупрозрачности в 16 битной режиме,

    function TfrmDD.Blend (const X, Y : Integer) : HRESULT;
    var
    desc : TDDSURFACEDESC2; i, j : Integer;
    wrkPointer : PWORD;
    sTemp, dTemp : WORD;
    sb, db, sg, dg, sr, dr : Byte;
    blue, green, red : Byte;
    hRet : HRESULT;
    begin
    ZeroMemory (@desc, SizeOf (desc) ) ; desc.dwSize := SizeOf(desc);
    hRet := FDDSBack.Lock (nil, desc, DDLOCK_WAIT, 0) ;
    if Failed (hRet) then begin Result := hRet;
    Exit;
    end;
    for i := 0 to imageWidth - 1 do
    for j := 0 to imageHeight - 1 do
    // Только для точек с цветом, отличным от цвета фона
    if Pict [i, j] <> ColorKey then
    begin
    wrkPointer := PWORD (Integer(desc.IpSurface) +
    (Y + j) * desc.lPitch + (X + i) * (ScreenBitDepth div 8));
    sTemp := Pict [i, j]; // Пиксел источника, точка образа
    dTemp := wrkPointer^; // Приемник, фоновая картинка
    sb = sTemp and $lf; // Синий цвет источника
    db = dTemp and $lf; // Синий цвет приемника
    sg = (sTemp shr 5) and $3f; // Зеленый цвет источника
    dg = (dTemp shr 5) and $3f; // Зеленый цвет приемника
    sr = (sTemp shr 11) and $lf; // Красный цвет источника
    dr = (dTemp shr 11) and $lf; // Красный цвет приемника
    blue := (ALPHA * (sb - db) shr 8) -t- db; // Результат, синий
    green := (ALPHA * (sg - dg) shr 8) + dg; // Результат, зеленый
    red := (ALPHA * (sr - dr) shr 8) + dr; // Результат, красный
    // Сложение цветовых компонентов в пикселе приемника
    wrkPointer^ := blue or (green shl 5) or (red shl 11);
    end;
    Result := FDDSBack.Unlock (nil);
    end;



    Возникает вопрос как эту же операцию сделать в 32 битном режиме
  • antonn © (20.04.08 23:15) [1]
    а что эта конструкция должна делать? :)
  • МистерТ (21.04.08 10:09) [2]
    Если поймешь почему там написано
    shr 5; shr 11;
    and $3f; and $1f
    то легко сделаешь и для 32битного и для 64 битного...
    и вообще, DirectDraw сейчас использовать стоит только в узкой предметной области, для остального лучше полноценный Direct3D8/9, там хотя бы прозрачность сама считается.
  • NaRuTo © (21.04.08 12:07) [3]
    Я подумал может быть вот так, но у меня что то не работает

    Я принял 32 битный как:
    Синий    - 11
    Зелёный - 10
    Красный - 11


    sTemp := Pict [i, j]; // Пиксел источника, точка образа
    dTemp := wrkPointer^; // Приемник, фоновая картинка
    sb:= sTemp and $lf; // Синий цвет источника
    db:= dTemp and $lf; // Синий цвет приемника
    sg:= (sTemp shr 11) and $3f; // Зеленый цвет источника
    dg:= (dTemp shr 11) and $3f; // Зеленый цвет приемника
    sr:= (sTemp shr 21) and $lf; // Красный цвет источника
    dr:= (dTemp shr 21) and $lf; // Красный цвет приемника
    blue := (ALPHA * (sb - db) shr 8) + db; // Результат, синий
    green := (ALPHA * (sg - dg) shr 8) + dg; // Результат, зеленый
    red := (ALPHA * (sr - dr) shr 8) + dr; // Результат, красный
    // Сложение цветовых компонентов в пикселе приемника
    wrkPointer^ := blue or (green * 2048) or (red * 2097152);

  • МистерТ (21.04.08 13:13) [4]
    мдааа....
    Наводящяя подсказка:
    1) shr - это смещение на несколько _бит_
    для 16-битного цвета применяется схема 5-6-5 (5 бит - красный, 6 бит - зеленый, 5 бит - синий), а теперь посчитай на сколько бит надо сместить синюю составляющую цвета для её установки "на место".
    Для 32 битного цвета схема 8-8-8-8 (альфа, красный, зеленый, синий).
    2) переведи 3f и 1f в двоичное представление и почитай про битовые маски.
  • NaRuTo © (21.04.08 14:25) [5]
    СПС!
  • NaRuTo © (21.04.08 14:40) [6]
    МистерТ: Извини, но ты бы не мог показать мне хотябы как синий цвет сделать, всю голову сломал не могу
 
Конференция "Media" » Полупрозрачность
Есть новые Нет новых   [133928   +471][b:0][p:0.002]