-
Как осуществить полупрозрачность:
Я использовал алгоритм полупрозрачности в 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, там хотя бы прозрачность сама считается. -
Я подумал может быть вот так, но у меня что то не работает
Я принял 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 в двоичное представление и почитай про битовые маски. -
СПС!
-
МистерТ: Извини, но ты бы не мог показать мне хотябы как синий цвет сделать, всю голову сломал не могу