Visual Basic - мастерская разработчика
Библиотеки

DirectX

Обзоры
DirectDraw
Direct3D
DirectX Audio
DirectPlay
DirectInput
Fido Topics
SourceCode
Tools&Libs

OpenGL

Статьи и учебники
Fido Topics
SourceCode
Tools&Libs

Архив по Glide

Движки

Обзоры
Учебники
SourceCode
Downloads

Создание игр

Ваши игры

Обзорные статьи
Учебники
Fido Topics
SourceCode
Download

Stuff

Программер-Чат

Псевдо-FTP
Disclaimer
Оффтопик

 

Создание поверхностей

"Теория DirectDraw"


Создание главной поверхности

Главной называется поверхность, видимая пользователем на мониторе. Она идентифицируется флагом DDSCAPS_PRIMARYSURFACE. Вы можете иметь только одну главную поверхность для каждого объекта DirectDraw.

При создании главной поверхности помните, что ее размеры соответствуют режиму экрана. Однако, вам не надо указывать ее размер при создании. Если вы сделаете это, вызов функции создания поверхности вернется с ошибкой, даже если вы укажете правильную информацию, соответствующую режиму экрана.

Вот пример задания описания главной поверхности перед ее созданием:

//---- C++
DDSURFACEDESC2 ddsd;
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;

'----- VB
Dim ddsd As DDSURFACEDESC2
ddsd.lFlags=DDSD_CAPS
ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE

Здесь ddsd - это тип DDSURFACEDESC2, в который заносится информация о поверхности. Чаще всего он используется перед совершением какого-либо действия над поверхностями.

После задания описания, вызывается метод создания поверхности IDirectDraw7::CreateSurface (DirectDraw7.CreateSurface) с параметром, указывающим на заполненную структуру DDSURFACEDESC2

 

Создание заднего буфера

Задний буфер - это как бы полотно, на котором происходит "сбор" спрайтов, фона, эффектов и т.п. очередного кадра. Затем, задний буфер полностью "переводится" на главную поверхность. Эта операция называется флиппинг.

Задний буфер обычно создают вместе с главной поверхностью, он получается как бы прикрепленным к ней. Такой "симбиоз" главной поверхности с одним или несколько задним буфером называется flipping-chain.

Набор поверхностей, создаваемых одним вызовом метода CreateSurface называется комплексной поверхностью. Такие поверхности могут управляться также только одним вызовом метода. Создание flipping-chain наиболее частое применение комплексных поверхностей.

Вот пример, как можно создать главную поверхность с прикрепленным задним буфером:

//----- C++
//Создать главную поверхность

ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_COMPLEX | DDSCAPS_FLIP |
DSCAPS_PRIMARYSURFACE;
ddsd.dwBackBufferCount = 1;
ddrval = lpDD->CreateSurface(&ddsd, &lpDDSPrimary, NULL);

//Получить задний буфер
caps.dwCaps = DDSCAPS_BACKBUFFER;
ddrval = lpDDSPrimary->GetAttachedSurface(&ddcaps, &lpDDSBack);

'----- VB
'Создать главную поверхность

ddsd.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_FLIP Or
DSCAPS_COMPLEX
ddsd.lBackBufferCount = 1
Set Primary = dd.CreateSurface(ddsd)

'Получить задний буфер
caps.lCaps = DDSCAPS_BACKBUFFER
Set BackBuffer = Primary.GetAttachedSurface(caps)

Здесь caps - это тип DDCAPS2, dd - DirectDraw7, Primary и BackBuffer - DirectDrawSurface7

 

Создание оффскринных поверхностей

Оффскринные (невидимые) поверхности часто используются для хранения (кэширования) изображений, которые потом будут перенесены на задний буфер. Вы должны объявить размеры оффскринной поверхности, включив флаги DDSC_WIDTH и DDSD_HEIGHT, а также значения членов lWidth и lHeight структуры DDSURFACEDESC2. Еще, вы должны указать флаг DDSCAPS_OFFSCREENPLAIN, в типе DDSCAPS, содержащемся в структуре DDSURFACEDESC2.

По-умолчанию, DirectDraw создает поверхность в видеопамяти, если только она полностью не занята. В противном случае, поверхность создается в системной памяти. Вы сами можете указать в какой памяти создавать поверхность, указав флаги DDSCAPS_SYSTEMMEMORY или DDSCAPS_VIDEOMEMORY в типе DDSCAPS, содержащемся в структуре DDSURFACEDESC2.

В этом примере показано как подготовить создание простой оффскринной поверхности 100x100:

ddsd.lFlags=DDSD_CAPS or DDSD_HEIGHT or DDSD_WIDTH
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN
ddsd.lHeight = 100
ddsd.lWidth = 100

 

Создание больших поверхностей

DirectDraw начиная с версии DirectX 5 позволяет создавать оффскринные поверхности, которые больше, чем главная поверхность. Однако это возможно только тогда, когда дисплейное оборудование позволяет делать это.

Чтобы проверить, поддерживает ли оборудование пользователя большие поверхности, вызовите метод IDirectDraw7::GetCaps (DirectDraw7.GetCaps) и посмотрите на наличие флага DDCAPS2_WIDESURFACES в члене dwCaps2 (lCaps2) первой структуры DDCAPS, которую вы передали при вызове. Если флаг присутствует, вы можете создавать большие поверхности.

Posted: 23.01.2k1
Autor: Antiloop
<anti_loop@mail.ru>

 


Проект
Создание Народного Учебника по OpenGL

Участвовать!
Поиск
Найдите статью или файл:


Рассылка
Новости сайта
La Vision в вашем почтовом ящике








Программирование на С++ Delphi и Паскаль
Центр демо-искусства в России