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

Уроки по DirectX

  Все выпуски  

Уроки по DirectX


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

Direct3D для Visual C++. Рассылки сайта progs.biz
Выпуск № 31
 
Начало > DirectX > Direct3D > VC++.NET > Урок 12

Джим Адамс. DirectX: продвинутая анимация.
Джим Адамс. DirectX: продвинутая анимация
Заказать на Озоне

Подробнее


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

Direct3D для Visual C++
Урок 12. Использование буфера глубины 1

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

Теперь приступаем к коду.

За основу возьмем код урока 8. Мы добавим к нашему треугольнику еще один, распложенный рядом с первым. Они будут вращаться, и всегда тот, который расположен ближе к нам, будет заслонять тот, который расположен дальше.

Вот такие изменения мы должны внести в наш код (это мы делаем аналогично уроку 9). Во-первых, мы должны создать два параллельных треугольника в методе InitVB:

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

        { -1.0f,-1.0f, -0.3f, 0xffff00ff, },
        {  1.0f,-1.0f, -0.3f, 0xff00ffff, },
        {  0.0f, 1.0f, -0.3f, 0xffffff00, },
    };
    // Создаем вершиный буфер.
    if(FAILED(g_pd3dDevice->CreateVertexBuffer(
        6*sizeof(CUSTOMVERTEX),
        0, D3DFVF_XYZ|D3DFVF_DIFFUSE,
        D3DPOOL_DEFAULT, &g_pVB, NULL)))
    {
        ...

Как видите, наши треугольники отличаются только z-координатами - они раздвинуты по оси z. Также обратите внимание, что мы несколькими строчками ниже указали 6 вершин.

Во-вторых, нам необходимо указать новое число треугольников в методе Render:

VOID Render()
{
    ...
        g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 2);

В-третьих, не забудьте указать при инициализации устройства что надо показывать все стороны наших треугольников:

HRESULT InitD3D( HWND hWnd )
{
    ...
    g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    ...
}

Теперь запускаем нашу программу. Мы увидим 2 труегольника, причем они будут отображаться неправильно - дальний из них может заслонять передний.

А вот как отображать их правильно с использованием буфера глубины мы рассмотрим на следующем уроке.

Рассылки сайта 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


PARKING.RU. Качественный ВИРТУАЛЬНЫЙ ХОСТИНГ на платформе Windows(r): поддержка NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый ВЫДЕЛЕННЫЙ ХОСТИНГ на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru


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

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

В избранное