![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прозрачность в DirectDraw
VLoB © (2003-06-05 01:38:00)
Уважаемые, как можно реализовать прозрачность поверхности в DirectDraw (DirectX6+, 16bpp)?
DelphiX, к сожалению, не использую, поэтому - не решение.
на сколько я понял, с 6-й версии в Blt - функции отсутствует аппаратная поддержка (если она вообще там была=) alpha - флага во всех его проявлениях.
делал попиксельную конвертацию (кусок фона+спрайт, через известную формулу, где альфа от 0 до 1), все работает, но не устраивает - медленно, даже при небольших спрайтах... что делать, не знаю :(
не возвращаться же к старым версиям directX!
VLoB (2003-06-11 20:50:00) [1]
внушаить! ;)
very big tnx, обязательно щас втыкну к себе! :)
блин, и почему я на асм забил??
SunSB (2003-06-11 05:06:00) [2]От сердца отрываю
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 //
Думкин (2003-06-10 05:40:00) [3]
> VLoB © (08.06.03 21:09)
Да, промахнулся - спутался. Под рукой нет - но у Краснова это вроде реализуется попиксельно.
A_n_t (2003-06-09 01:36:00) [4]
Если необходимо просто использовать (считывать, записывать, кидать на экран) картинку, то вручную создавать не надо, есть DirectX, вот пусть он и думает.
Про скорость: шибко не проверял, но память, то одинаковая - и работа с ней одинаковая.
P.S. В принципе, не важно как, лишь бы не в видео памяти :)
VLoB (2003-06-08 21:09:00) [5]
ок, под хранением в системке подразумевается создать DirectDraw поверхности с флагом DDSCAPS_SYSTEMMEMORY, или вручную создать куски памяти и в них распихать bmp - шки?
да, и что быстрее?
A_n_t (2003-06-07 10:47:00) [6]
Если хочешь alpha блендинг в DirectDraw, то только так, как ты и делал.
Правда есть пара советов про ускорение этого дела:
1. Храни обрабатываемые картинки в системке (ни в коем случае не считывай из видео памяти напрямую).
2. После обработки результат кидаешь в видюху (можно и во время обработки, попиксельно, если мало этих самых пикселей).
3. Используй асм - даст дополнительно несколько процентов.
А быстро и удобно - это только через Direct3D.
P.S.
// DelphiX, к сожалению, не использую, поэтому - не решение.
А DelphiX в этом вопросе, мало чем поможет :)
VLoB (2003-06-06 19:04:00) [7]
Уважаемый, я читаю МСДН и не только, ты не понял сути вопроса - мне не нужен цветовой ключ, и я говорил не о ColorKey - цвете,
мне нужна реализация alpha блендинга в DirectDraw!!
Думкин (2003-06-05 08:26:00) [8]
hRet := FDDSPrimary.BltFast(r.Left,r.Top, SHand.FDDSurFace, @r1, DDBLTFAST_WAIT or DDBLTFAST_SRCCOLORKEY);
Это в догонку. Вобщем, все поддерживается. Читай МСДН и не только.
Думкин (2003-06-05 08:24:00) [9]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-й пашет.