Введение в программирование трехмерных игр с DX9



         

Пример приложения: рассеянный свет - часть 3


Есть переменная для хранения сетки чайника, а за ней идет набор переменных D3DXHANDLE, чьи имена показывают для связи с какими переменными шейдера они используются.

Функция Setup выполняет следующие действия:

Создает сетку чайника.

Компилирует вершинный шейдер.

Создает вершинный шейдер на основе скомпилированного кода.

Получает через таблицу констант дескрипторы нескольких переменных программы шейдера.

Инициализирует через таблицу констант некоторые переменные шейдера.

ПРИМЕЧАНИЕ

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

bool Setup() { HRESULT hr = 0;

// // Создание геометрии: //

D3DXCreateTeapot(Device, &Teapot, 0);

// // Компиляция шейдера //

ID3DXBuffer* shader = 0; ID3DXBuffer* errorBuffer = 0;

hr = D3DXCompileShaderFromFile( "diffuse.txt", 0, 0, "Main", // имя точки входа "vs_1_1", D3DXSHADER_DEBUG, &shader, &errorBuffer, &DiffuseConstTable);

// Выводим сообщения об ошибках if(errorBuffer) { ::MessageBox(0, (char*)errorBuffer->GetBufferPointer(), 0, 0); d3d::Release<ID3DXBuffer*>(errorBuffer); }

if(FAILED(hr)) { ::MessageBox(0, "D3DXCompileShaderFromFile() - FAILED", 0, 0); return false; }

// // Создаем шейдер //

hr = Device->CreateVertexShader( (DWORD*)shader->GetBufferPointer(), &DiffuseShader);

if(FAILED(hr)) { ::MessageBox(0, "CreateVertexShader - FAILED", 0, 0); return false; }

d3d::Release<ID3DXBuffer*>(shader);

// // Получаем дескрипторы // ViewMatrixHandle = DiffuseConstTable->GetConstantByName( 0, "ViewMatrix"); ViewProjMatrixHandle = DiffuseConstTable->GetConstantByName( 0, "ViewProjMatrix"); AmbientMtrlHandle = DiffuseConstTable->GetConstantByName( 0, "AmbientMtrl"); DiffuseMtrlHandle = DiffuseConstTable->GetConstantByName( 0, "DiffuseMtrl"); LightDirHandle = DiffuseConstTable->GetConstantByName( 0, "LightDirection");




Содержание  Назад  Вперед