Форум: "Игры";
Текущий архив: 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.055 c