Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.09;
Скачать: CL | DM;

Вниз

Прозрачность в DirectDraw   Найти похожие ветки 

 
VLoB ©   (2003-06-05 01:38) [0]

Уважаемые, как можно реализовать прозрачность поверхности в DirectDraw (DirectX6+, 16bpp)?
DelphiX, к сожалению, не использую, поэтому - не решение.

на сколько я понял, с 6-й версии в Blt - функции отсутствует аппаратная поддержка (если она вообще там была=) alpha - флага во всех его проявлениях.

делал попиксельную конвертацию (кусок фона+спрайт, через известную формулу, где альфа от 0 до 1), все работает, но не устраивает - медленно, даже при небольших спрайтах... что делать, не знаю :(
не возвращаться же к старым версиям directX!


 
Думкин ©   (2003-06-05 08:24) [1]

function TSurFace.LoadImage : HResult;
var hRet : HResult;
c : TColor;
begin
hRet := DDCopyBitmap (FDDSurFace, BitMap.Handle, 0, 0, BitMap.Width, BitMap.Height);
c:=BitMap.Canvas.Pixels[BitMap.Width-1,BitMap.Height-1];
if hRet = DD_OK then hret := DDSetColorKey(FDDSurFace,c)
( hret,"Load") function TSurFace.LoadImage : HResult;
var hRet : HResult;
c : TColor;
begin
hRet := DDCopyBitmap (FDDSurFace, BitMap.Handle, 0, 0, BitMap.Width, BitMap.Height);
c:=BitMap.Canvas.Pixels[BitMap.Width-1,BitMap.Height-1];
if hRet = DD_OK then hret := DDSetColorKey(FDDSurFace,c)
else ErrorOut(hret,"Load");
Result:=hret
end;

все в 7-й пашет.


 
Думкин ©   (2003-06-05 08:26) [2]

hRet := FDDSPrimary.BltFast(r.Left,r.Top, SHand.FDDSurFace, @r1, DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);

Это в догонку. Вобщем, все поддерживается. Читай МСДН и не только.


 
VLoB ©   (2003-06-06 19:04) [3]

Уважаемый, я читаю МСДН и не только, ты не понял сути вопроса - мне не нужен цветовой ключ, и я говорил не о ColorKey - цвете,

мне нужна реализация alpha блендинга в DirectDraw!!


 
A_n_t   (2003-06-07 10:47) [4]

Если хочешь alpha блендинг в DirectDraw, то только так, как ты и делал.
Правда есть пара советов про ускорение этого дела:
1. Храни обрабатываемые картинки в системке (ни в коем случае не считывай из видео памяти напрямую).
2. После обработки результат кидаешь в видюху (можно и во время обработки, попиксельно, если мало этих самых пикселей).
3. Используй асм - даст дополнительно несколько процентов.

А быстро и удобно - это только через Direct3D.

P.S.
// DelphiX, к сожалению, не использую, поэтому - не решение.
А DelphiX в этом вопросе, мало чем поможет :)


 
VLoB ©   (2003-06-08 21:09) [5]

ок, под хранением в системке подразумевается создать DirectDraw поверхности с флагом DDSCAPS_SYSTEMMEMORY, или вручную создать куски памяти и в них распихать bmp - шки?

да, и что быстрее?


 
A_n_t   (2003-06-09 01:36) [6]

Если необходимо просто использовать (считывать, записывать, кидать на экран) картинку, то вручную создавать не надо, есть DirectX, вот пусть он и думает.

Про скорость: шибко не проверял, но память, то одинаковая - и работа с ней одинаковая.

P.S. В принципе, не важно как, лишь бы не в видео памяти :)


 
Думкин ©   (2003-06-10 05:40) [7]

> VLoB © (08.06.03 21:09)
Да, промахнулся - спутался. Под рукой нет - но у Краснова это вроде реализуется попиксельно.


 
SunSB   (2003-06-11 05:06) [8]

От сердца отрываю


procedure AsmBlt( Src, Dst: TDDSurf; srcR, DstR: TRect; bltType: word );
var Width : integer;
var srcLocked, dstLocked: boolean;
var srcDDSD, dstDDSD : TDDSURFACEDESC2;
begin
fillChar( dstDDSD, sizeOf( TDDSURFACEDESC2 ), #0);
dstDDSD.dwSize := sizeOf( TDDSURFACEDESC2 );
srcDDSD := dstDDSD;
dstLocked:=Dst.Lock( @dstR,dstDDSD,0{DDLOCK_WAIT+DDLOCK_NOSYSLOCK},0)=DD_OK;
srcLocked:=Src.Lock( @srcR,srcDDSD,0{DDLOCK_WAIT+DDLOCK_NOSYSLOCK},0)=DD_OK;
if srcLocked and dstlocked then begin
Width := dstR.Right - dstR.Left;
srcDDSD.lPitch := srcDDSD.lPitch - Width shl 1;
dstDDSD.lPitch := dstDDSD.lPitch - Width shl 1;
asm
push eax
push ebx
push ecx
push edx
push edi
push esi
cmp bltType, blt_Transp
jne @@1
mov ebx, offset @@blt_Transp
jmp @@Start
@@1:cmp bltType, blt_Shadow
jne @@2
mov ebx, offset @@blt_Shadow
jmp @@Start
@@2:cmp bltType, blt_TranspPlus
jne @@3
mov ebx, offset @@blt_TranspPlus
jmp @@Start
@@3:cmp bltType, blt_TranspMinus
jne @@4
mov ebx, offset @@blt_TranspMinus
jmp @@Start
@@4:cmp bltType, blt_Riddle
jne @@5
mov ebx, offset @@blt_Riddle
jmp @@Start
@@5:mov ebx, offset @@PutPoint
@@Start:
mov ecx, srcR.Bottom
sub ecx, srcR.Top
mov esi, srcDDSD.lpSurface
mov edi, dstDDSD.lpSurface
@@nextLine:
push ecx
mov ecx, Width
@@nextPoint:
lodsw
or ax, ax
jz @@shiftPoint //


 
VLoB ©   (2003-06-11 20:50) [9]

внушаить! ;)
very big tnx, обязательно щас втыкну к себе! :)

блин, и почему я на асм забил??



Страницы: 1 вся ветка

Текущий архив: 2003.10.09;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
14-27743
kopcap
2003-09-19 18:09
2003.10.09
Люди посоветуйте прогу для создания анимированных *.gif


4-27793
DelphiNew
2003-08-04 10:49
2003.10.09
Убийство процессов


3-27313
GreySerg
2003-09-17 18:11
2003.10.09
Как сохранить дерево в поле типа OLE Object базы Access?


14-27707
konstantinov
2003-09-20 22:41
2003.10.09
ХР и файлы TIF


14-27637
Knight
2003-09-19 11:02
2003.10.09
Sission и редирект в чём проблем?