Сергей Ваткин , Kelly Dempski , Johnny Watson , Константин Поздняков - DirectX 8. Начинаем работу с DirectX Graphics
Название: | DirectX 8. Начинаем работу с DirectX Graphics | |
Автор: | Сергей Ваткин , Kelly Dempski , Johnny Watson , Константин Поздняков | |
Жанр: | Современные российские издания, Литература ХXI века (эпоха Глобализации экономики), Windows, Программирование графики | |
Изадано в серии: | неизвестно | |
Издательство: | неизвестно | |
Год издания: | - | |
ISBN: | неизвестно | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "DirectX 8. Начинаем работу с DirectX Graphics"
Аннотация к этой книге отсутствует.
Читаем онлайн "DirectX 8. Начинаем работу с DirectX Graphics". [Страница - 7]
HRESULT CreateVertexBuffer(UINT Length, DWORD Usage, DWORD FVF, D3DPOOL Pool, IDirect3DVertexBuffer8** ppVertexBuffer);
Length — длина VB в байтах
Usage — дополнительная информация о VB, которую D3D использует для создания оптимального VB
FVF — формат вершин, которые будут храниться в VB
Pool — в какой памяти создавать VB (можно создать его как в видеопамяти, так и в RAM)
ppVertexBuffer — адрес переменной, которая будет содержать указатель на созданный VB
Всего для хранения полигонов пирамиды используется 4*3*sizeof(MYVERTEX) байт (4 полигона, по 3 вершины в каждом).
if (FAILED(g_pD3DDevice->CreateVertexBuffer(4*3*sizeof(MYVERTEX), 0, D3DFVF_MYVERTEX, D3DPOOL_DEFAULT, &g_pVB))) {
return FALSE;
}
Остается заполнить буфер вершинами. Для операций заполнения в DX (не только в D3D) используется пара команд Lock() и Unlock(). Команда Lock() возвращает адрес памяти, по которому расположен первый байт буфера. При этом вся память, отведенная под буфер как бы "запирается", и становится недоступной для других приложений. Операция "отпирания" памяти производится командой Unlock(). После запирания памяти, скопируем данные с помощью Си'шной функции memcpy().
VOID* pVertices;
if (FAILED(g_pVB->Lock(0, sizeof(Vertices), (BYTE**)&pVertices, 0))) return FALSE;
memcpy(pVertices, Vertices, sizeof(Vertices));
g_pVB->Unlock();
Функция DoMatrices()
Я считаю, что это — самая сложная для понимания функция. Разговор о матрицах выходит за формат данной статьи, т.к. это очень обширная тема. Советую почитать статьи JM'а по этому поводу (скажу по секрету — он фанат матриц ;o)). Но вкратце, я все равно расскажу о матрицах :-)У нас есть трехмерное пространство сцены, которое содержит вершины всех объектов, есть камера - глаз, с помощью которого мы видим это пространство, а также плоскость экрана монитора, на которую осуществляется проектирование. Все это ("мир", камера, операция проектирования) может быть выражено тремя матрицами: World Matrix (мировая матрица), View Matrix (видовая матрица) и Projection Matrix (проекционная матрица).
Вычислять эти матрицы "вручную" довольно сложно, поэтому воспользуемся функциями D3DX. Для матриц создан специальный тип данных D3DMATRIX. В библиотеке D3DX он расширен до типа данных D3DXMATRIX, в который добавлены арифметические операции с матрицами, и некоторые другие удобные свойства.
• Функция D3DXMatrixIdentity() строит единичную матрицу.
• Функция D3DXMatrixRotationZ() строит матрицу вращения относительно оси Z на заданный угол.
• Функция D3DXMatrixLookAtLH() строит видовую матрицу. Параметры этой функции задают точку, в которую будет смотреть камера. Постфикс -(LH) говорит о том, что матрица будет действительна для левосторонней системы координат (аналогично -(RH) для правосторонней)
• Функция D3DXMatrixPerspectiveFovLH() строит проекционную матрицу.
Для того, чтобы "заставить" устройство рендеринга использовать только что созданные нами матрицы, существует функция SetTransform():
HRESULT SetTransform(D3DTRANSFORMSTATETYPE State, CONST D3DMATRIX* pMatrix);
State — тип матрицы, которую нужно изменить (мировая, видовая, проекционная и т.д.)
pMatrix — указатель на "матрицу-заменитель" :)
Вот что нам требуется от каждой из матриц:
a. Мировая
Сделаем так, чтобы пирамида с течением времени равномерно вращалась вокруг оси Z:
D3DXMATRIX matWorld;
D3DXMatrixIdentity(&matWorld);
D3DXMatrixRotationZ(&matWorld, GetTickCount()/1024.0f);
g_pD3DDevice->SetTransform(D3DTS_WORLD, &matWorld);
b. Видовая
Камера должна смотреть на пирамиду сбоку, причем не должно быть видно нижнего основания пирамиды (помнишь, мы выбросили два полигона основания?):
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(5.0f, 5.0f, 6.5f), &D3DXVECTOR3(0.0f, 0.0f, 1.0f), &D3DXVECTOR3(0.0f, 0.0f, 1.0f));
g_pD3DDevice->SetTransform(D3DTS_VIEW, &matView);
c. Проекционная
D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/3, 1.0f, 1.0f, 100.0f);
g_pD3DDevice->SetTransform(D3DTS_PROJECTION, &matProj);
Здесь D3DX_PI/3 - это поле зрения (field of view) камеры. Попробуй поэкспериментировать с этим параметром.
Функция RenderScene()
Собственно, здесь и происходит рендеринг сцены. Как всегда, он начинается с очистки окна и Z-Buffer'а:g_pD3DDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(100, 100, 100), 1.0f, 0);
Затем, подготавливаем D3D к началу сцены.
g_pD3DDevice->BeginScene();
Пересчитываем матрицы:
DoMatrices();
Теперь настроим текстуру. И вообще, здесь подходящее место для того, чтобы вкратце рассказать о том, что такое текстура и текстурные координаты! Итак… Текстура — это графическая картинка, которая используется для натягивания на трехмерный (и не только) объект, что придает ему --">Книги схожие с «DirectX 8. Начинаем работу с DirectX Graphics» по жанру, серии, автору или названию:
Елена Геннадьевна Васнецова - Полная энциклопедия домашнего хозяйства Жанр: Энциклопедии Год издания: 2012 |
Валентина Ивановна Назарова - Современные теплицы и парники Жанр: Сад и огород Год издания: 2011 |
Борис Николаевич Шапталов - Как организовали внезапное нападение 22 июня 1941. Заговор Сталина. Причины и следствия Жанр: История: прочее Год издания: 2015 |
Олег Пауллер - Псы войны. Дневники Шеннона Жанр: Приключения Год издания: 2018 |