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

       

Соответствие между вершинами ландшафта и координатами текстур



Рисунок 13.5. Соответствие между вершинами ландшафта и координатами текстур

<
И, в заключение, приведем код генерации данных вершин:

bool Terrain::computeVertices() { HRESULT hr = 0;

hr = _device->CreateVertexBuffer( _numVertices * sizeof(TerrainVertex), D3DUSAGE_WRITEONLY, TerrainVertex::FVF, D3DPOOL_MANAGED, &_vb, 0);

if(FAILED(hr)) return false;

// координаты, с которых начинается генерация вершин int startX = -_width / 2; int startZ = _depth / 2;

// координаты, на которых завершается генерация вершин int endX = _width / 2; int endZ = -_depth / 2;

// вычисляем приращение координат текстуры // при переходе от одной вершины к другой. float uCoordIncrementSize = 1.0f / (float)_numCellsPerRow; float vCoordIncrementSize = 1.0f / (float)_numCellsPerCol;

TerrainVertex* v = 0; _vb->Lock(0, 0, (void**)&v, 0);

int i = 0; for(int z = startZ; z >= endZ; z -= _cellSpacing) { int j = 0; for(int x = startX; x <= endX; x += _cellSpacing) { // вычисляем правильный индекс в буфере вершин // и карте высот на основании счетчиков вложенных циклов int index = i * _numVertsPerRow + j;

v[index] = TerrainVertex( (float)x, (float)_heightmap[index], (float)z, (float)j * uCoordIncrementSize, (float)i * vCoordIncrementSize);

j++; // следующий столбец } i++; // следующая строка }

_vb->Unlock();

return true; }


Содержание раздела