Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.12.26;
Скачать: [xml.tar.bz2];

Вниз

Помогите с блиттингом 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.039 c
1-1102143951
Viktop
2004-12-04 10:05
2004.12.26
Перемещение с PageControl на Frame2


14-1102278234
Youri1
2004-12-05 23:23
2004.12.26
Проэкт базы даных


4-1100097837
Павел
2004-11-10 17:43
2004.12.26
USB->RS232


14-1102498783
Delphin
2004-12-08 12:39
2004.12.26
Умер комп


3-1101503798
Sid
2004-11-27 00:16
2004.12.26
PREPORT





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский