Соответствие между вершинами ландшафта и координатами текстур
Рисунок 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; }