Форум: "Media";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];
ВнизПрозрачность в 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 вся ветка
Форум: "Media";
Текущий архив: 2003.10.09;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c