Отправляет email-рассылки с помощью сервиса Sendsay

Уроки по DirectX

  Все выпуски  

Уроки по DirectX


Информационный Канал Subscribe.Ru

Direct3D для Visual C++. Рассылки сайта progs.biz  
Начало > DirectX > Direct3D > VC++.NET > Урок 4

Боресков А. В. Графика трехмерной компьютерной игры на основе OpenGL.
Боресков А. В. Графика трехмерной компьютерной игры на основе OpenGL.
Заказать на Озоне


Полные версии уроков (с картинками): урок 4.

Direct3D для Visual C++
Урок 4. Вывод примитива

Настало время вывести что-нибудь на созданное нами устройство. Схема действий тут такая - сначала мы создаем наш объект. Вообще любой объект состоит из множества треугольников, и наш объект - не исключение. Правда, состоять он будет только из одного треугольника - для простоты изложения.

Итак, начинаем.

Для начала объявим глобальную переменную для хранения вершин нашей фигуры и структуру для хранения данных каждой вершины:

LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
struct CUSTOMVERTEX
{
    FLOAT x, y, z, rhw; // Координаты вершины.
    DWORD color;        // Цвет вершины.
};

Потом добавим функцию InitVB для инициализации вершинного буфера (VB в названии и означает Vertex Buffer, а не Visual Basic, естественно ;)):

HRESULT InitVB()
{
    // Задаем три вершины треугольника.
    CUSTOMVERTEX vertices[] =
    {
        {100.0f, 30.0f, 0.0f, 1.0f, 0xffffff00},
        {170.0f, 130.0f, 0.0f, 1.0f, 0xff00ff00},
        {30.0f, 130.0f, 0.0f, 1.0f, 0xff0000ff}
    };

    // Создаем вершиный буфер.
    if(FAILED(g_pd3dDevice->CreateVertexBuffer(
        3*sizeof(CUSTOMVERTEX),
        0, D3DFVF_XYZRHW|D3DFVF_DIFFUSE,
        D3DPOOL_DEFAULT, &g_pVB, NULL )))
    {
        // Если не удалось создать вершинный буфер, то выходим.
        return E_FAIL;
    }

    // Заполнение вершинного буфера данными.
    VOID* pVertices;
    if(FAILED(g_pVB->Lock(0, sizeof(vertices), (void**)&pVertices, 0 )))
        return E_FAIL;
    memcpy(pVertices, vertices, sizeof(vertices));
    g_pVB->Unlock();

    return S_OK;
}

Эту функцию надо вызвать в функции WinMain:

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPSTR     lpCmdLine,
                   int       nCmdShow)
{
    ...
    if(!SUCCEEDED(InitD3D(hWnd)))
    {
        return 0;
    }
    // Вызов функции инициализации.
    InitVB();
    ...

Ну и, наконец, надо в функцию Render (в ней, собственно говоря, и происходит рисование), добавить код для нашего треугольника:

VOID Render()
{
    ...
    // Начало отрисовки сцены.
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        
        // Отрисовка треугольника.
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX));
        g_pd3dDevice->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE);
        g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
        
        // Конец отрисовки сцены.
        g_pd3dDevice->EndScene();
    }
    ...

Запускаем программу. Результатом будет окно с треугольником.

Рассылки сайта progs.biz
Visual C++, MFC
C# и .NET
VB.NET
Win API
C/C++
Delphi
Java
HTML, PHP, mySQL, WEB-дизайн
Flash MX new!
C++ Builder
Ассемблер
SQL Server
DirectX
Обзор книг
Обзор программ
Новости сайта progs.biz


Копирование любых материалов сайта без разрешения авторов и владельцев сайта запрещено.
2002-2004 сайт progs.biz
2002-2004 Алексеев Игорь

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.directxlessons
Отписаться

В избранное