Сбор нормалей для отдельных лиц в выделенные структуры, такие как std::multimap
, не является необходимым для этой задачи. Поскольку нет необходимости различать guish одну грань от другой, а нормали являются нормализованными векторами - проще и проще собирать нормали для каждого треугольника непосредственно в данные вершин, а затем нормализовать их.
Копирование Параметр indicies
вместо передачи его по ссылке также звучит избыточно и дорого.
glm::triangleNormal()
, вероятно, нормализует вычисленный вектор, но для этих вычислений он быстрее (и лучше - меньшие треугольники будут оказывать меньшее влияние на нормальный результат ) пропустить нормализацию нормального треугольника на этом шаге.
void Controller::TerrainFactory::GenerateNormals(std::vector<Blue::Vertex>& verticies,
const std::vector<unsigned int>& indicies)
{
// first loop could be skipped, if verticies[i].normals were no spoiled before
for (size_t vert = 0; vert < verticies.size(); ++vert)
{
verticies[vert].normals = glm::vec3();
}
// append triangle normals to every vertex
for (size_t index = 0; index < indicies.size(); index += 3)
{
Blue::Vertex& vert1 = verticies[indicies[index]];
Blue::Vertex& vert2 = verticies[indicies[index + 1]];
Blue::Vertex& vert3 = verticies[indicies[index + 2]];
// glm::triangleNormal() probably returns normalized vector,
// which is better to compute unnormalized
glm::vec3 triNormal = glm::triangleNormal(vert1.position,
vert2.position,
vert3.position);
vert1.normals += triNormal;
vert2.normals += triNormal;
vert3.normals += triNormal;
}
// normalize normal vectors
for (size_t vert = 0; vert < verticies.size(); ++vert)
{
Blue::Vertex& vertBlue = verticies[vert];
vertBlue.normals = glm::normalize(vertBlue.normals);
}