Войти
ПрограммированиеFAQГрафика

Как рассчитать tangent space с помощью NVMESHMENDER?

Что бы облегчить нам жизнь, инженеры NVIDIA создали NVMeshMender, основной задачей которого является расчет tangent space для по пиксельного освещения. Учитывая набор вершин, текстурных координат и нормалей (опционально) NVMeshMender рассчитывает бинормаль и тангент. Кроме того NVMeshMender выполняет множество оптимизаций над вершинами и индексами.

Использование NVMeshMender:

Ваш формат вершин должен обязательно содержать такие данные:

D3DXVECTOR3 pos;
float s, t;
Если вы хотите, что бы NVMeshMender посчитал нормали за вас, то в функции Mend укажите MeshMender::CALCULATE_NORMALS, иначе придется вводить еще и нормаль.

Далее необходимо скопировать информацию из ваших вершин в вершины, которые понимает NVMeshMender:

std::vector< MeshMender::Vertex > theVerts;
std::vector< unsigned int > theIndices;
std::vector< unsigned int > mappingNewToOld;

for(DWORD i = 0; i < numVerts; ++i)
{
  MeshMender::Vertex v;
  v.pos = myVerts[i].pos;
  v.s = myVerts[i].s;
  v.t = myVerts[i].t;
  theVerts.push_back(v);
};

Тоже проделываем и с индексами:

for(DWORD ind= 0 ; ind< numIndices; ++ind)
{
  theIndices.push_back(myIndices[ind]);
}

Ну и наконец рассчитываем tangent space:

mender.Mend( theVerts,  theIndices,
  mappingNewToOld,
  minNormalCreaseCos,
          minTangentCreaseCos,
          minBinormalCreaseCos,
          weightNormalsByArea,
          MeshMender::CALCULATE_NORMALS,
          MeshMender::DONT_RESPECT_SPLITS
          MeshMender::DONT_FIX_CYLINDRICAL
);
//О других значениях передаваемых в функцию Mend, читайте ее header.
После такой обработки количество вершин может изменится, поскольку выполняется разбиение из-за групп сглаживания. Количество индексов останется неизменным.

Теперь занесем данные в вершинный и индексный буфера:

mVertexBuffer->Lock(0,0,(void**)&pVertices,0);
for(DWORD i = 0; i < theVerts.size(); ++i)
{
pVertices[i].position = theVerts[i].pos;
  pVertices[i].s  = theVerts[i].s;
  pVertices[i].t  = theVerts[i].t;
  pVertices[i].normal = theVerts[i].normal;
  pVertices[i].binormal = theVerts[i].binormal;
  pVertices[i].tangent = theVerts[i].tangent;
};
mVertexBuffer->Unlock();

mIndexBuffer->Lock(0,0,(void**)&pIndices,0 );
for(DWORD i = 0; i < theIndices.size(); i++)
{
  pIndices[i]=theIndices[i];
};
mIndexBuffer->Unlock();

7 августа 2005 (Обновление: 15 апр. 2012)

Комментарии [3]