Среда, 18.06.2025, 16:03
Приветствую Вас Гость | RSS
Меню сайта
fff
  • Индексация
  • Девочки
    Форма входа
    Категории раздела
    Теория алгоритмов [3]
    Теория алгоритмов
    Code Snippets [1]
    Code Snippets
    Все о PHP [20]
    Все о PHP
    Visual C++ [13]
    Visual C++
    WIN32 API [7]
    WIN32 API
    Delphi [72]
    Delphi
    ASP [2]
    ASP
    Java [67]
    Java
    VBScript [6]
    VBScript
    CGI [2]
    CGI
    VRML [2]
    VRML
    PERL [9]
    PERL
    HTML [4]
    HTML
    XML [10]
    XML
    Архив записей

    Статьи по Оптимизации

    ПРОГРАММИРОВАНИЕ! СОЗДАНИЕ САЙТОВ И ИХ ОПТИМИЗАЦИЯ

    Главная » Статьи » Программирование » Visual C++

    Direct3dX - От теории к практике
    Direct3dX - От теории к практике
    Ну ладно, вы уже создали простейшую программу. Теперь вы хотите, чтобы она чего-нибудь показывала, например треугольник. Если вы создали программу по методу, изложенному в предыдущем уроке, то вам будет немного сложнее ее отлаживать, если используете AppWizard – вам нужно будет дольше ее чистить. Пусть вы сделали все это. Теперь вам нужно создать структуру, которая будет описывать тип вашей вершины. Пусть информация о вершине будет содержать координаты точки и ее цвет, тогда код будет выглядеть так:

    struct CUSTOMVERTEX
    {
    D3DXVECTOR3 pos;
    float diffuse;
    };

    #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE)

    Внимание: если вы используете функции, начинающиеся с D3DX, добавьте в проект D3dx8.lib. После того, как вы сделали это, создайте какую-нибудь функцию инициализации (например InitApp()). Там вы должны создать буффер вершин (предварительно определив его):

    LPDIRECT3DVERTEXBUFFER8 m_VB; // в начало файла

    g_pd3dDevice -> CreateVertexBuffer(3*sizeof(CUSTOMVETEX), 0, D3DFVF_CUSTOMVERTEX, &m_VB);

    Вы создали буффер вершин на три вершины. Теперь надо его заполнить. Для этого напишите следующий жуткий кусок кода:

    VOID* pVertices;
    CUSTOMVERTEX gVertices[3];
    // вы описываете вершины //
    gVertices[0].pos=D3DXVECTOR3(1.0f, 1.0f, 1.0f);
    gVertices[0].diffuse=0xff0000ff;
    …..
    //-вы закончили описание вершин//

    m_pVB->Lock( 0, sizeof(gVertices), (BYTE**)&pVertices, 0 );
    memcpy(pVertices, gVertices, sizeof(gVertices));
    m_pVB->Unlock();

    Вставьте эту функцию после InitD3D(). Внимание: эта функция должна вызываться только одит раз, т.к. в ней создается буффур вершин, при повторном ее запуске программа вылетит с ошибкой. Теперь эту функцию можно временно покинуть. Найдите функцию Render(). Залезте между BeginScene и EndScene, вставьте туда вот это:

    g_pd3dDevice->SetRenderState(D3DRS_CULLMODE , D3DCULL_NONE); // чтобы рендерилась задняя сторона полигона
    g_pd3dDevice->SetStreamSource( 0, m_pVB, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );
    g_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1 );

    Функция SetStreamSource сообщает рендеру откуда брать точки (из m_pVB). SetVertexShader указывает текущий вертексный шейдер. Поскольку его сейчас нет, то ставим стандартный. Третья функция, как понятно из названия, рисует треугольник (одну штуку). Вот вроде и все, можете запускать. Если после запуска все точки будут черными, то добавьте перед SetStreamSource следующий кусок:

    g_pd3dDevice->SetRenderState(D3DRS_AMBIENT, 100);

    Теперь вы увидите цвет вершин. На этом точно все.

    Категория: Visual C++ | Добавил: Merlin (07.12.2009)
    Просмотров: 387 | Комментарии: 2 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *: