Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
9-27291
Андрей22
2003-04-07 20:26
2003.10.09
Где можно найти исходники программы


3-27338
123
2003-09-20 09:49
2003.10.09
Exceptions + Query


3-27383
voodoo
2003-09-21 13:30
2003.10.09
Число записей


14-27648
___Nikolay
2003-09-19 05:52
2003.10.09
* Задача 3 *


1-27513
Pushkin
2003-09-26 13:34
2003.10.09
Как в StringGrid сделать проверку данных в ячейке?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский