![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DirectDraw: создание поверхностей [Win95/98, Win2k]
miek © (2004-03-04 20:21:00)Создаю две поверхности:
DDrawObject.SetCooperativeLevel( form.handle,
DDSCL_EXCLUSIVE or DDSCL_FULLSCREEN or DDSCL_FPUSETUP);
DDrawObject.SetDisplayMode( ScreenX, ScreenY, bpp);
with SurfaceDescription do
begin
dwSize:= sizeof( SurfaceDescription);
dwFlags:= DDSD_CAPS;
ddsCaps.dwCaps:= DDSCAPS_PRIMARYSURFACE;
end;
DDrawObject.CreateSurface( SurfaceDescription, PrimarySurface, nil);
with surfacedescription do
begin
dwSize:= sizeof( SurfaceDescription);
dwFlags:= DDSD_CAPS or DDSD_WIDTH or DDSD_HEIGHT or DDSD_PIXELFORMAT;
dwwidth:= screenx;
dwheight:= screeny;
ddpfPixelFormat.dwSize:= sizeof( surfacedescription.ddpfPixelFormat);
ddpfPixelFormat.dwFlags:= DDPF_RGB;
ddpfPixelFormat.dwRGBBitCount:= bpp;
ddpfPixelFormat.dwRBitMask:= $007C00;
ddpfPixelFormat.dwGBitMask:= $0003E0;
ddpfPixelFormat.dwBBitMask:= $00001F;
ddscaps.dwCaps:= DDSCAPS_OFFSCREENPLAIN;
end;
DDrawObject.CreateSurface( SurfaceDescription, SecondarySurface, nil);
Все работает прекрасно (перенос делаю через BltFast), только содержимое второй поверхности интерпретируется как RGB 5-6-5 вместо 5-5-5, несмотря на флаги. Естественно, все цвета "ползут". Как переубедить DirectDraw? Или это от видеокарты зависит и не лечится?
miek (2004-03-25 16:40:00) [1]Продолжение. Теперь в режиме 8-бит (Uniform), для удобства.
www.miek.narod.ru/dxplatforms.zip
miek (2004-03-06 10:16:00) [2]>Ошибки значит наделал, ищи.
Все! Я разобрался с этой фигней. Предлагаю посмотреть на рабочую демку;
www.miek.narod.ru/dxplatforms.zip
Сверхвысоких FPS не наблюдается, конечно. Но надо учесть, что все рисуется софтварно и каждый кадр пересылается из системной памяти по таймеру(!). Да и скорости вполне хватит на клон, допустим, "Космических рейнджеров". Скоро SpriteUtils-2 будет конкурировать с PowerDraw!
cyborg (2004-03-06 10:08:00) [3]
> Почему 32-бита не работает, не въеду никак.
Ошибки значит наделал, ищи.
> Всего делов - этак 5000-10000 строк кода добавить!
Чего это у тебя там понаписано? По идее, всего нужно исправить конвертер цвета, строчки 3-4.
miek (2004-03-06 09:46:00) [4]>Ну сделай, чтобы 565 поддерживало, на бит сдвиги влево увелич и всего делов.
Всего делов - этак 5000-10000 строк кода добавить!
Но хрен с ним, с 16-битным, мне бы хоть в каком-нибудь рисовать нормально. Почему 32-бита не работает, не въеду никак.
cyborg (2004-03-05 22:30:00) [5]> А мне весьма надо 555, так как SpriteUtils только с ним
> работает.
Ну сделай, чтобы 565 поддерживало, на бит сдвиги влево увелич и всего делов.
cyborg (2004-03-05 22:28:00) [6]
> которая не используется потом
Пардон, не обратил внимания на with surfacedescription do
cyborg (2004-03-05 22:26:00) [7]Поверхности будут создаваться битового формата главной поверхности.
К томуже что это за структура ddpfPixelFormat заполняется, которая не используется потом?
miek (2004-03-05 21:33:00) [8]Екарный бабай! Кроме 16-битного режима, вообще ничто не пашет! Просто меняю на 24 или 32, и вообще не работает.
miek (2004-03-05 20:40:00) [9]Странно получается - S3 Virge держит 555, а GeForce2 - нет. А мне весьма надо 555, так как SpriteUtils только с ним работает.
cyborg (2004-03-04 21:40:00) [10]Создаётся только такое, какое имеется у главной/первичной поверхности.
Видимо всё создаётся как 565, а зачем вобще делать 555, если можно 565? ;) оно всё равно 16 бит занимает, и похоже, что не все видеокарты поддерживают режим 555.