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

Уроки по DirectX

  Все выпуски  

Уроки по DirectX Урок 18. Использование освещения в DirectX 1


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

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

Подробнее


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

Сертификация
- Как устроиться на высокооплачиваемую работу?
- Как получить прибавку к зарплате?
- Как завоевать уважение коллег?
- Пройти сертификацию и продемонстрировать свой профессионализм. Подробнее…

Direct3D для Visual C++
Урок 18. Использование освещения в DirectX 1

Для использования света в DirectX мы должны сделать несколько действий. Сначала мы должны сделать изменение формата вершин:

struct CUSTOMVERTEX
{
    FLOAT x, y, z;
    D3DXVECTOR3 normal;
};

Изменения были такие - мы добавили нормаль (это вектор, перпендикулярный нашему треугольнику) и из того, что было, оставили только x, y и z - координаты вершины. Нормаль нам нужна, чтобы определять, куда будет отражаться свет. И именно благодаря нормалям у нас разные грани будут освещены по-разному - в зависимости от того, под каким углом та или иная грань будет повернута по отношению к направлению света.

Как следствие этого мы должны поменять везде формат вершин. Таких мест у нас 2 - это метод InitVB и Render. В обоих этих методах мы должны поменять D3DFVF_XYZ | D3DFVF_DIFFUSE на D3DFVF_XYZ | D3DFVF_NORMAL.

Кроме того необходимо изменить метод InitVB - так как теперь наши вершины имеют другой формат, то и инициализировать мы их должны тоже по-другому - а именно, добавить везде вектор нормали и оставить из того что было только координаты вершины:

HRESULT InitVB()
{
    // Задаем вершины.
    CUSTOMVERTEX vertices[] =
    {
        // Front.
        { -1.0f, -1.0f, -1.0f, D3DXVECTOR3(0, 0, -1) },
        {  1.0f, -1.0f, -1.0f, D3DXVECTOR3(0, 0, -1) },
        {  1.0f,  1.0f, -1.0f, D3DXVECTOR3(0, 0, -1) },

        { -1.0f, -1.0f, -1.0f, D3DXVECTOR3(0, 0, -1) },
        {  1.0f,  1.0f, -1.0f, D3DXVECTOR3(0, 0, -1) },
        { -1.0f,  1.0f, -1.0f, D3DXVECTOR3(0, 0, -1) },

        // Left.
        { -1.0f, -1.0f,  1.0f, D3DXVECTOR3(-1, 0, 0) },
        { -1.0f, -1.0f, -1.0f, D3DXVECTOR3(-1, 0, 0) },
        { -1.0f,  1.0f, -1.0f, D3DXVECTOR3(-1, 0, 0) },

        { -1.0f, -1.0f,  1.0f, D3DXVECTOR3(-1, 0, 0) },
        { -1.0f,  1.0f, -1.0f, D3DXVECTOR3(-1, 0, 0) },
        { -1.0f,  1.0f,  1.0f, D3DXVECTOR3(-1, 0, 0) },

        // Back.
        {  1.0f, -1.0f,  1.0f, D3DXVECTOR3(0, 0, 1) },
        { -1.0f,  1.0f,  1.0f, D3DXVECTOR3(0, 0, 1) },
        {  1.0f,  1.0f,  1.0f, D3DXVECTOR3(0, 0, 1) },

        { -1.0f,  1.0f,  1.0f, D3DXVECTOR3(0, 0, 1) },
        {  1.0f, -1.0f,  1.0f, D3DXVECTOR3(0, 0, 1) },
        { -1.0f, -1.0f,  1.0f, D3DXVECTOR3(0, 0, 1) },

        // Right.
        {  1.0f, -1.0f, -1.0f, D3DXVECTOR3(1, 0, 0) },
        {  1.0f,  1.0f,  1.0f, D3DXVECTOR3(1, 0, 0) },
        {  1.0f,  1.0f, -1.0f, D3DXVECTOR3(1, 0, 0) },

        {  1.0f, -1.0f, -1.0f, D3DXVECTOR3(1, 0, 0) },
        {  1.0f, -1.0f,  1.0f, D3DXVECTOR3(1, 0, 0) },
        {  1.0f,  1.0f,  1.0f, D3DXVECTOR3(1, 0, 0) },

        // Top.
        {  1.0f,  1.0f,  1.0f, D3DXVECTOR3(0, 1, 0) },
        { -1.0f,  1.0f, -1.0f, D3DXVECTOR3(0, 1, 0) },
        {  1.0f,  1.0f, -1.0f, D3DXVECTOR3(0, 1, 0) },

        { -1.0f,  1.0f, -1.0f, D3DXVECTOR3(0, 1, 0) },
        {  1.0f,  1.0f,  1.0f, D3DXVECTOR3(0, 1, 0) },
        { -1.0f,  1.0f,  1.0f, D3DXVECTOR3(0, 1, 0) },

        // Buttom.
        { -1.0f, -1.0f,  1.0f, D3DXVECTOR3(0, -1, 0) },
        {  1.0f, -1.0f, -1.0f, D3DXVECTOR3(0, -1, 0) },
        { -1.0f, -1.0f, -1.0f, D3DXVECTOR3(0, -1, 0) },

        {  1.0f, -1.0f, -1.0f, D3DXVECTOR3(0, -1, 0) },
        { -1.0f, -1.0f,  1.0f, D3DXVECTOR3(0, -1, 0) },
        {  1.0f, -1.0f,  1.0f, D3DXVECTOR3(0, -1, 0) },
        ...
    }

В приведенном фрагменте кода мы строим куб - для которого нам надо по два треугольника на каждую грань.

С изменением формата вершин все. Непосредственно освещением мы займемся на следующем уроке.

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


Parking.ru. Качественный виртуальный хостинг на платформе Windows(r): поддержка NET, многофункциональная панель управления, аренда бизнес-приложений, сертифицированные специалисты. Управляемый выделенный хостинг на платформе Windows(r): производительные серверы, профессиональная поддержка, аренда ПО Microsoft(r), безопасность, гарантии. http://www.parking.ru


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

В избранное