【发布时间】:2020-04-21 04:50:54
【问题描述】:
我需要为我的 OpenGL 应用程序生成软法线,但是这个函数的处理时间是荒谬的。在对其进行分析之后,似乎我的多地图 emplace 处理时间高得离谱。我做了一些研究,发现您可以在插入/位置上使用提示,但不知道如何实现它,或者即使我的方法是生成法线的最佳方式。如果您知道更好的方法或加速此代码段的方法,我很乐意听到。
void Controller::TerrainFactory::GenerateNormals(std::vector<Blue::Vertex> &verticies,
std::vector<unsigned int> indicies) {
std::vector<Blue::Faces> faces;
std::multimap<unsigned int, size_t> setFaces;
for (size_t index = 0; index < indicies.size(); index += 3) {
faces.push_back(Blue::Faces{});
auto &face = faces.at(faces.size() - 1);
face.indicies[0] = indicies.at(index);
face.indicies[1] = indicies.at(index + 1);
face.indicies[2] = indicies.at(index + 2);
face.normal = glm::triangleNormal(verticies.at(face.indicies[0]).position,
verticies.at(face.indicies[1]).position,
verticies.at(face.indicies[2]).position);
const auto size = faces.size() - 1;
setFaces.emplace(face.indicies[0], size);
setFaces.emplace(face.indicies[1], size);
setFaces.emplace(face.indicies[2], size);
}
for (unsigned index = 0; index < verticies.size(); ++index) {
int count = 0;
auto itr1 = setFaces.lower_bound(index);
auto itr2 = setFaces.upper_bound(index);
auto avgNormal = glm::vec3{};
while (itr1 != itr2) {
if (itr1->first == index) {
avgNormal += faces.at(itr1->second).normal;
++count;
}
++itr1;
}
verticies.at(index).normals = avgNormal / static_cast<float>(count);
}
struct Vertex {
glm::vec3 position = {};
glm::vec2 texCoords = {};
glm::vec3 normals = {};
};
struct Faces {
unsigned int indicies[3] = {};
glm::vec3 normal = {};
};
【问题讨论】:
标签: c++ opengl optimization multimap normals