Использование вершинного шейдера морфируемого комбинирования

После того как вы создали вершинный шейдер, вспомогательные структуры и объявления вершин, вы можете заставить это все работать! Предположим, что имеется базовый меш и четыре целевых меша, уже загруженных в объекты меша.

ID3DXMesh *pBaseMesh/

ID3DXMesh *pMesh1,*pMesh2,*pMesh3,*pMesh4/

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

IDirect3DVertexShader9 *pShader/ IDirect3DVertexDeclaration9 *pDecl/

После загрузки вершинного шейдера вы можете установить его для визуализирования комбинированных мешей, с помощью следующих строк:

pDevice->SetFVF(NULL)/ //Очистить использование FVF pDevice->SetVertexShader(pShader)/ //Установить вершинный шейдер pDevice->SetVertexDeclaration(pDecl)/ //Установить объявления

Чтобы начать рисовать комбинированный меш, вы должны установить потоки вершин, указывающие на буферы вершин меша. Даже если вы не используете четыре комбинируемых меша, вы должны всегда устанавливать потоки вершин; просто используйте буфер вершин базового меша в качестве потока, если у вас менее четырех комбинируемых мешей.

// Получить размер вершины

DWORD VertexStride =D3DXGetFvFvertexSize(pBaseMesh->GetFVF()) / //Получить указатели на буферы вершин IDirect3DVertexBuffer9 *pBaseVB/ IDirect3DVertexBuffer9 *pMesh1vB,*pMesh2VB/ IDirect3DVertexBuffer9 *pMesh3VB,*pMesh4vB/

pBaseMesh->GetVertexBuffer(&pBaseVB) / pMesh1->GetVertexBuffer(&pMesh1VB)/ pMesh2->GetVertexBuffer(&pMesh2VB)/ pMesh3->GetVertexBuffer(&pMesh3VB)/ pMesh4->GetVertexBuffer(&pMesh4VB)/ //Установить потоки вершин

pDevice->SetStreamSource(0,pBaseVB,VertexStride)/ pDevice->SetStreamSource(1,pMesh1VB,VertexStride)/ pDevice->SetStreamSource(2,pMesh2VB,VertexStride)/ pDevice->SetStreamSource(3,pMesh3VB,VertexStride)/ pDevice->SetStreamSource(4,pMesh4VB,VertexStride)/

Теперь необходимо получить текущие матрицы преобразования мира, вида и проекции вашего 3D устройства. Эти матрицы объединяются, транспонируются и сохраняются в регистры констант вершинного шейдера с с0 до с3. Следующий код замечательно с этим справляется.

//Получить матрицы мира, вида и проекции D3DXMATRIX matWorld,matView,matProj/ pDevice->GetTransform(D3DTS_WORLD,&matWorld)/

pDevice->GetTransform(D3DTS_VIEW,&matView); рВех1се->ОеРТгапвРогт(В3ВТ8_РК0иЕСТ10Ы,&таРРго]);

//Получить матрицу мир*вид*проекция и установить ее D3DXMATRIX matWVP;

matWVP =matWorld *matView *matProj; D3DXMatrixTranspose(&matWVP,&matWVP);

g_pD3DDevice->SetVertexShaderConstantF(0,(float*)&matWVP,4);

Для управления величиной комбинирования для каждого меша просто измените значения, хранимые в регистре с4. Регистр х константы с4 представляет собой величину комбинирования для первого меша и меняется в диапазоне от 0 до 1 (или больше, если вы хотите получить преувеличенные результаты).

Заметание. На самом деле вы не должны вызывать GetTransform для полученияраз-личныхматриц преобразования. Этиматрицы должныхраниться в вашем приложении, по возможности (но необязательно) на глобальномуровне.

Аналогично и для с4.у, с4.ъ, с4.\¥ - каждый меш имеет регистр, хранящийвеличину комбинирования (у для второго меша, ъ для третьего, \¥ для четвертого).

Пока что установим значения комбинирования в 100 процентов (сохраняязначение 1.0 для каждого значения комбинирования в объекте В3ВХ\ТіСТ(Ж4)

и сохраним эти значения в константе вершинного шейдера с4, используя функцию

БеїУегІехБпасІегСо^ІапіР.

//Установить величины комбинирования

D3DXVECTOR4 vecBlending =D3DXVECTOR4(1.0f,1.0f,1.0f,1.0f) ; pDevice->SetVertexShaderConstantF(4,(float*)&vecBlending,1) ;

Последнее что нужно сделать, это установить направление света сцены (то же самое, что использовалось в структуре В3ВЬЮНТ9) в константу вершинного шейдера с5. Например, если вы хотите, чтобы свет (расположенный в мировом пространстве) был направлен вниз, вы можете использовать вектор с координатами 0,1,0. (Заметьте, что используете объект В3ВХУЕСТ(Ж4 для сохранения направления вектора, в противоположность объекту ВЗВХУЕСТСЖЗ просто задайте 0 в качестве компоненты \¥.)

//Установить вектор света

D3DXVECTOR3 vecLight =D3DXVECTOR4(0.0f,1.0f,0.0f,0.0f) ;

pDevice->SetVertexShaderConstantF(5,(float*)&vecLight,1);

Т. к. вы получаете данные вершин из набора объектов ГО3ВХМе8п, вам необходимо установить буфер индексов, потому что все объекты ГО3ВХМе8п используют индексированные списки элементарных объектов. Необходимо установить буфер индексов только базового меша, потому что буферы индексов одинаковы у всех мешей. Следующий код устанавливает буфер индексов базового меша:

//Установить буфер индексов 1В1гесс3В1пб!ехВиггег9 *р1пб^ев ; рВавеМев]п-^еМпбехВиггег(&р1пб^ев); рВеу1се->8еЬ1пб1сев(р1пб1сев,0);

Наконец, вы можете визуализировать комбинированный меш! Пропуская стандартный код установки текстур и материалов, вы можете визуализировать весь меш, используя следующий код:

// Визуализировать меш

pDevice->DrawInбexeбPrimitive(D3DPT_TRIANGLELIST, \

0,рВавеМевЬ->ОеЬЫитУегЬ1сев(), \ 0,pBaвeMeвh->GetNumFaceв());

Если вы хотите увидеть полнофункциональный пример вершинного шейдера комбинированного морфирования, посмотрите на демонстрационную программу ВЬпсгМогрпУБ, расположенную на компакт-диске. В главе 11 "Морфируемая лицевая анимация" вы увидите как использовать вершинный шейдер для создания привлекательных лицевых анимаций!

Посмотрите демонстрационные программы

Демонстрационные программы главы 10 (В1епс1Могр11 и ВЬпсМогрпУБ) иллюстрируют использование материала данной главы для комбинирования набора мешей в один анимированный меш. Обе программы, хотя и похожи внешне (рис. 10.3), используют различные технологии для визуализирования комбинированных морфируемых анимаций.

В В1епсгМогр11 анимации достигаются блокированием, обновлением и разблокированием буферов вершин различных мешей. В В^псСМогрИУБ код блокировки, обновления и разблокирования был убран, зато был добавлен код, иллюстрирующий возможности использования мощи вершинных шейдеров при изменении буферов вершин! В любом случае, обе программы не разочаруют вас!

Программы на компакт-диске

В директории главы 10 компакт-диска книги вы обнаружите два проекта, которые иллюстрируют использование комбинированных морфируемых анимаций. Этими проектами являются:

• ИепсИИогрЬ. В этом проекте вы увидите, как создавать анимацию, комбинируя морфируемые анимации, непосредственно изменяя вершины мешей. Этот проект расположен в \ВоокСоСе\Спар10\В1епсгМогрг1..

Использование вершинного шейдера морфируемого комбинирования

Рис. 10.3. Вводная часть лицевой анимации. Посмотрите, как комбинирование различных мешей может создавать простые анимации лица

• В1еш1МогрЬУ8. Посмотрите, как осуществлять комбинированные морфируемые анимации при помощи вершинного шейдера, разработанного в этой главе. Этот проект расположен в \ВоокСоСе\Спар10\В1епСМофГ1У8.

Глава 11

Морфируемая лицеваяанимация

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

Современные игры, использующие лицевую анимацию, такие как Medal of Honor: Frontline фирмы Electronic Art и Baldur's Gate: Dark Alliance фирмы Interplay повысили планку, и использование лицевой анимации быстро становится стандартом де-факто. Лицевая анимация в обеих этих играх просто потрясает. Добавленное ощущение реальности только увеличивает удовольствие игроков от каждой игры. Разве вы не хотите добавить реализма своему игровому проекту? Если да, тогда эта глава как раз то, что вам нужно.

В этой главе вы научитесь:

• Использовать технологии комбинированных морфируемых анимаций для анимирования лица;

• Создавать лицевые меши для использования в ваших проектах;

• Создавать фонемы и выражения лиц;

• Создавать последовательности анимации, использующие фонемы и выражения лиц;

• Проигрывать и синхронизировать лицевые анимации со звуковым потоком.

Создание вершинных шейдеров комбинированного морфирования || Оглавление || Основы лицевой анимации