На главную страницу Написать письмо Добавить в избранное Сделать www.comprog.ru стартовой

Создание и отрисовка одного треугольника

После того, как мы создали с вами простое приложение и инициализировали D3D8, мы можем начать рисовать то, что нам необходимо. В данном уроке мы научимся создавать и рисовать одиночный треугольник (точнее два треугольника :). Я надеюсь, что вы уже знакомы с основами трехмерной геометрии, поэтому не буду здесь приводит выкладки по данной теме. Приступим сразу к реализации данных принципов с использованием D3D8.

Начнем с реализации и отрисовки двухмерных треугольников.

Мы будем использовать концепцию буферов вершин (Vertex buffers) - они используются для хранения и отображения вершин. Вершины могут быть объявлены многими различными способами указанием пользовательской структуры для одной вершины и соответствующего пользовательского гибкого формата вершины (flexible vertex format - FVF). Для формата вершины мы будем использовать нижеследующее объявление :

оно показывает, что у нашей вершины будут такие параметры, как положение ( X , Y , Z ), для уже трансформированной вершины (у нас двухмерный случай, не забыли?) параметр RHW , и цвета ( color ).

Далее нам необходимо объявить FVF :

мы показываем, что наша вершина содержит компоненты положения и трансформации ( D3DFVF_XYZRHW ) и компоненту цвета( D3DFVF_DIFFUSE ).

Далее, после того как у нас объявлен формат вершины, мы можем инициализировать вершины в буфере вершин. Для этого нам понадобится указатель на интерфейс буфера вершин IDirect3DVertexBuffer8 :

Теперь все первоначальные настройки у нас готовы и мы можем приступать к самой интересной части - инициализация вершин и вывод треугольников на экран.

Начнем, соответственно, с инициализации вершин в буфере вершин :

-- Сперва мы инициализируем наши вершины, всего шеть штук, задаем им необходимые параметры положения и цвета.
-- Следующим шагом мы создаем буфер вершин - первым параметром идет размер буфера ( 6*sizeof(CUSTOMVERTEX) ), потом флаг импользования контроля (нам он пока не нужен, поэтому приравнивем его 0 ), далее FVF для описания вершины ( D3DFVF_CUSTOMVERTEX ), затем параметр отвечающий за использование памяти (нам он тоже пока не нужен, ставим по умолчанию - D3DPOOL_DEFAULT ), и последним параметром идет указатель на интерфейс буфера вершин с которым мы будем работать ( &p_VertexBuffer ).
-- после того как мы инициализировали буфер вершин, нам необходимо поместить информацию о наших, ранее указанных, вершинах в этот буфер. За это отвечают следующие далее строки :

-- Блокируем буфер вершин для доступа,
-- Копируем информацию о наших вершинах в буфер,
-- Разблокируем буфер.

Теперь у нас есть готовый к дальнейшей работе буфер вершин. Теперь нам необходимо отобразит на экране. Делаем это следующим образом, в функцию отрисовки экрана RenderScreen() , между строками начала и конца сцены, вставляем следующие строки, которые будут рисовать наши треугольники :

-- Первой строкой мы даем знать D3D о том, какой тип вершин мы будем сейчас использовать.
-- Затем задаем поток, с которым мы будем работать - первый параметр это номер потока, второй параметр связывает данный номер потока с источником данных (в нашем случае - p_VertexBuffer ), и третий параметр это размер необходимых нам данных.
-- Последней, третьей, строкой мы рисуем наши примитивы. В данном методе присутствуют следующие параметры - первый это тип отображаемого примитива ( D3DPT_TRIANGLELIST ), второй - индекс первой вершины, с которой мы начнем рисовать ( 0 ), и третий - количество заданных примитивов (в нашем случае это 2 треугольника).

Теперь запустив приложение вы должны увидеть нечто следующее :

Вот и все...

Ах да, чуть не забыл, после работы с интерфейсом буфера вершин, его также необходимо удалить в функции DestroyDirect3D8() :


	_RELEASE_ (p_VertexBuffer);

Вот теперь все...

  Поиск по сайту
  
Яндекс цитирования