netlib.narod.ru< Назад | Оглавление | Далее >

4.4. Пример приложения: цветные треугольники

Пример приложения из этой главы отображает закрашенные треугольники: для одного из них используется равномерное затенение, а для другого — затенение по методу Гуро. Результат визуализации показан на рис. 4.2. Сперва мы добавляем несколько глобальных переменных:

D3DXMATRIX World;
IDirect3DVertexBuffer9* Triangle = 0;

Матрица D3DXMATRIX будет использоваться для мирового преобразования тех треугольников, которые мы будем рисовать. Переменная Triangle является буфером вершин в котором хранятся вершины треугольника. Обратите внимание, что мы храним данные только одного треугольника и рисуем его несколько раз указывая различные матрицы мирового преобразования чтобы изменить его местоположение в сцене.

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

bool Setup()
{
     // Создание буфера вершин
     Device->CreateVertexBuffer(
                     3 * sizeof(ColorVertex),
                     D3DUSAGE_WRITEONLY,
                     ColorVertex::FVF,
                     D3DPOOL_MANAGED,
                     &Triangle,
                     0);

     // Заполнение буфера данными вершин треугольника
     ColorVertex* v;
     Triangle->Lock(0, 0, (void**)&v, 0);

     v[0] = ColorVertex(-1.0f, 0.0f, 2.0f,
                        D3DCOLOR_XRGB(255,   0,   0));
     v[1] = ColorVertex( 0.0f, 1.0f, 2.0f,
                        D3DCOLOR_XRGB(  0, 255,   0));
     v[2] = ColorVertex( 1.0f, 0.0f, 2.0f,
                        D3DCOLOR_XRGB(  0,   0, 255));

     Triangle->Unlock();

     // Установка матрицы проекции
     D3DXMATRIX proj;
     D3DXMatrixPerspectiveFovLH(
                     &proj,
                     D3DX_PI * 0.5f, // 90 градусов
                     (float)Width / (float)Height,
                     1.0f,
                     1000.0f);
     Device->SetTransform(D3DTS_PROJECTION, &proj);

     // Установка режима визуализации
     Device->SetRenderState(D3DRS_LIGHTING, false);

     return true;
}

Затем функция Display дважды рисует объект Triangle в двух различных местах и с различными режимами затенения. Позиция каждого треугольника задается матрицей мирового преобразования World.

bool Display(float timeDelta)
{
     if(Device)
     {
          Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
                                              0xffffffff, 1.0f, 0);
          Device->BeginScene();

          Device->SetFVF(ColorVertex::FVF);
          Device->SetStreamSource(0, Triangle, 0, sizeof(ColorVertex));

          // Рисуем левый треугольник с равномерной заливкой
          D3DXMatrixTranslation(&World, -1.25f, 0.0f, 0.0f);
          Device->SetTransform(D3DTS_WORLD, &World);

          Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT);
          Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

          // Рисуем правый треугольник с заливкой Гуро
          D3DXMatrixTranslation(&World, 1.25f, 0.0f, 0.0f);
          Device->SetTransform(D3DTS_WORLD, &World);

          Device->SetRenderState(D3DRS_SHADEMODE, D3DSHADE_GOURAUD);
          Device->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);

          Device->EndScene();
          Device->Present(0, 0, 0, 0);
     }
     return true;
}

netlib.narod.ru< Назад | Оглавление | Далее >

Сайт управляется системой uCoz