У нас: 141825 рефератів
Щойно додані Реферати Тор 100
Скористайтеся пошуком, наприклад Реферат        Грубий пошук Точний пошук
Вхід в абонемент


D3D_OK.

У випадку помилки повертається одне з наступних значень:

D3DERR_INVALIDCALL

D3DERR_DEVICELOST

- HRESULT CreateVertexBuffer(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer9 **ppVertexBuffer, HANDLE *pHandle)

Створення буфера вершин

Length - розмір буфера вершин у байтах.

Usage - спосіб застосування буфера вершин, у більшості випадків використається 0, але можна використати одне або кілька значень констант D3DUSAGE:

D3DUSAGE_DONOTCLIP - вказує на те, що буфер вершин ніколи не буде вимагати перемикання. Коли Вам потрібно буде відобразити вміст буфера, установите прапорець D3DRS_CLIPPING в false (неправда).

D3DUSAGE_DYNAMIC - вказує коли вершинам або буферу вимагає використання динамічної пам'яті. Це дозволяє драйверу самому вирішувати куди розмістити. Так, статичний буфер вершин міститься у відео пам'ять, а динамічний в AGP пам'ять. Якщо Ви не використаєте прапорець D3DUSAGE_DYNAMIC, Ви тим самим призначаєте використання статичної пам'яті. D3DUSAGE_DYNAMIC строго прописується через D3DLOCK_DISCARD й D3DLOCK_NOOVERWRITE. Прапорці D3DLOCK_DISCARD й D3DLOCK_NOOVERWRITE впливають на вершини й буфер створені за допомогою D3DUSAGE_DYNAMIC; вони не можуть впливати на статичний буфер вершин.

D3DUSAGE_RTPATCHES - вказує, коли буфер вершин повинен використати промальовування високоякісного примітива.

D3DUSAGE_NPATCHES - вказує, коли буфер вершин використає промальовування N шматків.

D3DUSAGE_POINTS - вказує, коли буфер вершин використає промальовування покажчика на спрайт або список покажчиків.

D3DUSAGE_SOFTWAREPROCESSING - вказує, коли буфер вершин використає програмну обробку вершин.

D3DUSAGE_WRITEONLY - повідомляє системі, що пише тільки буфер вершин. Використання цього прапорця дозволяє драйверу оптимизировать пам'ять для ефективного запису операцій і візуалізації. Намагається прочитати буфер вершин і потім створити.

FVF - вказується формат вершин.

Pool - опис формату вершин для розміщення в пам'яті використовуючи член типу, що перераховує.

- typedef enum _D3DPOOL

typedef enum _D3DPOOL

{

D3DPOOL_DEFAULT = 0, //за замовчуванням

D3DPOOL_MANAGED = 1, //ресурси копіюються автоматично в доступну для пристроїв пам'ять

D3DPOOL_SYSTEMMEM = 2, //використає системну оперативну пам'ять

D3DPOOL_SCRATCH = 3, //ресурс міститься в системну пам'ять і не обновляється при втраті пристрою

D3DPOOL_FORCE_DWORD = 0x7fffffff //не використається

} D3DPOOL;

ppVertexBuffer - покажчик на адресу в якому буде зберігатися адреса створюваного буфера вершин.

pHandle - завжди встановлюйте в 0, це зарезервований параметр.

Значення, що повертає. Якщо функція завершена успішно, тоді повертається значення D3D_OK, інакше:

D3DERR_INVALIDCALL

D3DERR_OUTOFVIDEOMEMORY

E_OUTOFMEMORY

- HRESULT Lock(UINT OffsetToLock, UINT SizeToLock, VOID **ppbData, DWORD Flags)

Блокування діапазону вершин для одержання покажчика на пам'ять буфера вершин.

OffsetToLock - указує на границю даних вершин для блокування, виміряється в байтах. Для того що б заблокувати весь буфер використається значення 0.

SizeToLock - розмір буфера для блокування, якщо обидва параметри встановлені в NULL - блокується весь буфер вершин.

ppbData - означає адреса покажчика на покажчик з даними буфера вершин.

Flags - описує тип блокування.

D3DLOCK_DISCARD - блокується кожне положення в межах блокируемой області.

D3DLOCK_NO_DIRTY_UPDATE - відбувається «додавання» даних на згадку.

D3DLOCK_NO_SYSLOCK - блокує систему на великий проміжок часу.

D3DLOCK_READONLY - додаток не буде записано в буфер.

D3DLOCK_NOOVERWRITE - цей прапор виключає запис у буфер вершин при вже наявних даних у буфері.

- RESULT Unlock(VOID)

Розблокування буфера вершин.

- HRESULT SetStreamSource(UINT StreamNumber, IDirect3DVertexBuffer9 *pStreamData, UINT OffsetInBytes, UINT Stride)

Зв'язування буфера вершин з потоком дані пристрої.

StreamNumber - визначає протока даних від 0 до -1.

pStreamData - покажчик на створюваний буфер вершин, що зв'язується з потоком даних.

OffsetInBytes - зсув від початку потоку, так початку вершин у байтах. Якщо встановити в 0, вивід буде відбуватися починаючи з першої вершини.

Stride - розмір структури задающей вершину.

- HRESULT SetFVF(DWORD FVF)

Установка формату вершин.

- HRESULT DrawPrimitive(D3DPRIMITIVETYPE PrimitiveType, UINT StartVertex, UINT PrimitiveCount)

PrimitiveType - перераховує тип, ЩО, D3DPRIMITIVETYPE, що описує тип примітива для виводу на екран.

typedef enum _D3DPRIMITIVETYPE

{

D3DPT_POINTLIST = 1, //визначає вершини, як набір крапок

D3DPT_LINELIST = 2, //визначає вершини, як список прямих ліній

D3DPT_LINESTRIP = 3, //визначає вершини, як окрему ламану лінію

D3DPT_TRIANGLELIST = 4, //кожна група 3х вершин визначає окремий трикутник

D3DPT_TRIANGLESTRIP = 5, // відображає зазначені вершини як кілька трикутників зв'язаних між собою

D3DPT_TRIANGLEFAN = 6, // відображає трикутники, вершини якого представляють вид віяла

D3DPT_FORCE_DWORD = 0x7fffffff //значення не використається

} D3DPRIMITIVETYPE;

StartVertex - індекс першої вершини для завантаження.

PrimitiveCount - кількість виведених примітивів.

3.3 Створення віконного додатка

Перш ніж приступитися до програмування графіки за допомогою Direct, необхідно створити каркас програми. Каркас додатка це найпростішому Windows додаток, його опис пропустимо через те, що воно розглянуто у всіх книгах програмування під Windows, і опис можна знайти на багатьох сайтах в Інтернеті. Головна відмінність - це вивід на екран, ми не використаємо повідомлення WM_PAINT, а обробка повідомлень виглядає в такий спосіб:

while(msg.message!=WM_QUIT)

{

if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}else

RenderScene();

}

Створюємо цикл, вихід з якого можливий при одержанні повідомлення WM_QUIT.

Замість звичної функції GetMessage використаємо PeekMessage, що призначена для роботи в режимі реального часу. Так як постійно сканується черга повідомлень, якщо такі є, вони обробляються, інакше викликається функція RenderScene() у якій відбувається створення й вивід сцени на екран.

3.4 Ініціалізація Direct

Для початку необхідно підключити заголовний файл.

Тепер необхідно підключити бібліотекір d3d9.lib, її можна підключити у властивостях проекту або явно підключити з використанням команди препроцесора #pragma. Різниці ніякий ні, використаємо другий спосіб:

#pragma comment(lib, "d3d9.lib")

Створимо функцію, у якій будуть ініціюватись інтерфейси Direct:

bool InitDirect(void).

Створюємо глобальні змінні:

LPDIRECT3D9 pDirect3D - покажчик на головний інтерфейс. Це перший об'єкт, якому необхідно створити, тільки після цього можна одержати доступ до всіх інших інтерфейсів.

LPDIRECT3DDEVICE9 pDirectDevice - інтерфейс пристрою Direct3D.

Для зручності створимо функцію InitDirect(), у якій будемо ініціювати пристрій 3D.

bool InitDirect(void)

{

if((pDirect3D=Direct3DCreate9(D3D_SDK_VERSION)) == NULL)

return(false);

D3DDISPLAYMODE stDisplay;

if(FAILED(pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &stDisplay)))

return(false);

D3DPRESENT_PARAMETERS Direct3DParametr;

ZeroMemory(&Direct3DParametr, sizeof(Direct3DParametr));

Direct3DParametr.Windowed=TRUE;

Direct3DParametr.SwapEffect=D3DSWAPEFFECT_DISCARD;

Direct3DParametr.BackBufferFormat=stDisplay.Format;

if(FAILED(pDirect3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,

hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &Direct3DParametr, &pDirectDevice)))

return(false);

return(true);

}

pDirect3D=Direct3DCreate9(D3D_SDK_VERSION) - створюється основний покажчик на інтерфейс IDirect3D9. Завжди використається один макрос D3D_SDK_VERSION, що вказує на поточну версію SDK.

Для перевірки результату виконання функції


Сторінки: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20