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

Вниз

Помогите с блиттингом DirectDraw   Найти похожие ветки 

 
Shurik   (2004-08-20 03:30) [0]

Я создал главную поверхность с такими параметрами:
ZeroMemory (@Desc, SizeOf (TDDSurfaceDesc2));
Desc.dwSize:=SizeOf (TDDSurfaceDesc2);
Desc.dwFlags:=DDSD_CAPS or DDSD_BACKBUFFERCOUNT;
Desc.ddsCaps.dwCaps:=DDSCAPS_PRIMARYSURFACE or DDSCAPS_FLIP or DDSCAPS_COMPLEX
    or DDSCAPS_VIDEOMEMORY;
Desc.dwBackBufferCount:=1;

Потом мне понадобились несколько OffScreen-поверхностей с заданным форматом пикселей и своим буфером:
ZeroMemory (@Desc, SizeOf (TDDSurfaceDesc2));
Desc.dwSize:=SizeOf (TDDSurfaceDesc2);
Desc.dwFlags:=DDSD_CAPS or DDSD_HEIGHT or DDSD_LPSURFACE or DDSD_PITCH or
    DDSD_PIXELFORMAT or DDSD_WIDTH;
Desc.dwWidth:=Width;
Desc.dwHeight:=Height;
Desc.lPitch:=Width shl 2;
Desc.lpSurface:=Data;
Desc.ddsCaps.dwCaps:=DDSCAPS_OFFSCREENPLAIN or DDSCAPS_SYSTEMMEMORY;
Desc.ddpfPixelFormat.dwSize:=SizeOf (Desc.ddpfPixelFormat);
Desc.ddpfPixelFormat.dwFlags:=DDPF_ALPHAPIXELS or DDPF_RGB;
Desc.ddpfPixelFormat.dwRGBBitCount:=32;
Desc.ddpfPixelFormat.dwRBitMask:=$000000FF;
Desc.ddpfPixelFormat.dwGBitMask:=$0000FF00;
Desc.ddpfPixelFormat.dwBBitMask:=$00FF0000;
Desc.ddpfPixelFormat.dwRGBAlphaBitMask:=$FF000000;

В конце концов мне нужно перенести кртинку с одной из OffScreen-поверхностей на экран. Я пытаюсь скопировать её с помощью метода Blt на вторичный буфер и сделать Flip:
BackBuffer.Blt (@ScreenArea, Surface, @ScreenArea, DDBLT_WAIT, nil);
MainSurface.Flip (nil, DDFLIP_WAIT);

И Blt выдаёт ошибку DDERR_UNSUPPORTED.

Что я делаю не так?


 
cyborg ©   (2004-08-20 09:10) [1]

Скорей всего не нужно указывать поверхности конкретный формат пикселя, она должна создаваться с форматом созданной главной поверхности. Альфа тоже в директдрау не поддерживается.


 
NikeOLD   (2004-08-20 09:41) [2]

Если у тебя полноэкранное приложение, то формат пикселя задавать нельзя. Альфа тоже не поддерживается.


> Desc.lPitch:=Width shl 2;
> Desc.lpSurface:=Data;

Это-то зачем? Кроме того, при таком подходе нужно быть уверенным, что в Data выделен достаточный буфер для хранения твоей поверхности. По окончании работы этот буфер должен удалятся приложением (DDraw не освободит!) Лучше пусть DDraw этим занимается. Почтиай SDK там все ясно описано, с примерами.

Кроме того, а где очистка формата пикселей: ZeroMemory(&ddsd2.ddpfPixelFormat, sizeof(DDPIXELFORMAT));? Ты не можешь быть уверен, что там все чисто и нету лишнего.


 
Shurik   (2004-08-22 01:54) [3]

> ZeroMemory(&ddsd2.ddpfPixelFormat, sizeof(DDPIXELFORMAT));
- абсолютно лишнее, т.к. поле ddpfPixelFormat чиститься вместе со
ddsd2 (у меня - Desc).

> Desc.lPitch:=Width shl 2;
> Desc.lpSurface:=Data;

Мне _нужно_, по некоторым причинам. И одной из них является то, что в Data уже лежат готовые данные, полученные со стороны. Со своими буферами я обращаюсь более чем аккуратно.

Контретный формат пикселя мне также необходим. Мне нужна поверхность с цветом пикселя заданным как RGB-тройка плюс некоторый байт, который я трактую как альфа-значение пикселя для ручного микширования спрайтов. DirectDraw действительно не поддерживает альфа-канал. Но ведь при копировании на вторичный буфер альфа значения не должны использоваться? В любом случае, я пробовал и так:

ZeroMemory (@Desc, SizeOf (TDDSurfaceDesc2));
Desc.dwSize:=SizeOf (TDDSurfaceDesc2);
Desc.dwFlags:=DDSD_CAPS or DDSD_HEIGHT or DDSD_LPSURFACE or DDSD_PITCH or
   DDSD_PIXELFORMAT or DDSD_WIDTH;
Desc.dwWidth:=Width;
Desc.dwHeight:=Height;
Desc.lPitch:=Width shl 2;
Desc.lpSurface:=Data;
Desc.ddsCaps.dwCaps:=DDSCAPS_OFFSCREENPLAIN or DDSCAPS_SYSTEMMEMORY;
Desc.ddpfPixelFormat.dwSize:=SizeOf (Desc.ddpfPixelFormat);
Desc.ddpfPixelFormat.dwFlags:=DDPF_RGB;
Desc.ddpfPixelFormat.dwRGBBitCount:=32;
Desc.ddpfPixelFormat.dwRBitMask:=$000000FF;
Desc.ddpfPixelFormat.dwGBitMask:=$0000FF00;
Desc.ddpfPixelFormat.dwBBitMask:=$00FF0000;

По сути это тоже самое, только я не говорю DirectDraw смысл четвёртого байта в четвёрке байтов. Вроде бы всё должно быть в порядке, но всё равно копириться не хочет...


 
cyborg ©   (2004-08-22 08:38) [4]

Тебе же сказали, что поверхность нельзя создать с отличным от главной поверхности форматом цвета. Какой у тебя формат?


 
Shurik   (2004-08-23 05:47) [5]

Поверхность создать можно. И она спокойто юзается. Тока вот проблемы с блиттингом.

Кстати говоря, я поменял местами R- и B-слои:

Desc.ddpfPixelFormat.dwFlags:=DDPF_RGB;
Desc.ddpfPixelFormat.dwRGBBitCount:=32;
Desc.ddpfPixelFormat.dwRBitMask:=$000000FF;
Desc.ddpfPixelFormat.dwGBitMask:=$0000FF00;
Desc.ddpfPixelFormat.dwBBitMask:=$00FF0000;

Теперь работает даже BltFast, но только для 32-го режима. Для всех прочих не работает ни BltFast, ни Blt. Похоже, что большего от DirectDraw добиться не удасться.


 
cyborg ©   (2004-08-23 08:26) [6]


> Теперь работает даже BltFast, но только для 32-го режима.
> Для всех прочих не работает ни BltFast, ни Blt.

Ты читать умеешь?

> [4] cyborg ©   (22.08.04 08:38)
> поверхность нельзя создать с отличным
> от главной поверхности форматом цвета.

Только добавить "чтобы работало" :)


 
NikeOLD   (2004-08-23 09:50) [7]

Вот пример из  SDK сравни с твоим, кое-что различно


// For this example, g_lpDD is a valid IDirectDraw7 interface pointer.

#define WIDTH  64 // in pixels
#define HEIGHT 64
#define DEPTH  3  // in bytes (3bytes == 24 bits)

   HRESULT hr;
   LPVOID  lpSurface  = NULL;
   HLOCAL  hMemHandle = NULL;
   DDSURFACEDESC2 ddsd2;
   LPDIRECTDRAWSURFACE7 lpDDS;

   // Allocate memory for a 64 by 64, 24-bit per pixel buffer.
   // REMEMBER: The application is responsible for freeing this
   //           buffer when it is no longer needed.
   if (lpSurface = malloc((size_t)WIDTH*HEIGHT*DEPTH))
       ZeroMemory(lpSurface, (DWORD)WIDTH*HEIGHT*DEPTH);
   else
       return DDERR_OUTOFMEMORY;

   // Initialize the surface description.
   ZeroMemory(&ddsd2, sizeof(DDSURFACEDESC2));
   ZeroMemory(&ddsd2.ddpfPixelFormat, sizeof(DDPIXELFORMAT));
   ddsd2.dwSize = sizeof(ddsd2);
   ddsd2.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_LPSURFACE |
                   DDSD_PITCH | DDSD_PIXELFORMAT | DDSD_CAPS;
   ddsd2.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN |
                          DDSCAPS_SYSTEMMEMORY;
   ddsd2.dwWidth = WIDTH;
   ddsd2.dwHeight= HEIGHT;
   ddsd2.lPitch  = (LONG)DEPTH * WIDTH;
   ddsd2.lpSurface = lpSurface;

   // Set up the pixel format for 24-bit RGB (8-8-8).
   ddsd2.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
   ddsd2.ddpfPixelFormat.dwFlags= DDPF_RGB;
   ddsd2.ddpfPixelFormat.dwRGBBitCount = (DWORD)DEPTH*8;
   ddsd2.ddpfPixelFormat.dwRBitMask    = 0x00FF0000;
   ddsd2.ddpfPixelFormat.dwGBitMask    = 0x0000FF00;
   ddsd2.ddpfPixelFormat.dwBBitMask    = 0x000000FF;

   // Create the surface
   hr = g_lpDD->CreateSurface(&ddsd2, &lpDDS, NULL);
   return hr;


Подсказка: обрати внимание на ddsd2.lPitch  = (LONG)DEPTH * WIDTH;



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

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

Наверх




Память: 0.49 MB
Время: 0.041 c
14-1102600410
Kirill
2004-12-09 16:53
2004.12.26
Пропали компоненты


1-1102693516
Frozzen
2004-12-10 18:45
2004.12.26
Не могу считать файл в буфер!


4-1100151730
Delph
2004-11-11 08:42
2004.12.26
Блокировка щелчка мышью в заголовке окна (формы)


1-1102874750
Bobby Digital
2004-12-12 21:05
2004.12.26
Glyph


14-1102189823
vecna
2004-12-04 22:50
2004.12.26
педали