【发布时间】:2022-02-06 21:25:24
【问题描述】:
我正在为实时网格变形制作应用程序,我需要大量计算法线。现在问题是我通过一些分析发现这段代码占用了最大的 cpu 时间,那么我该如何优化呢?
void Mesh::RecalculateNormals()
{
for (int i = 0; i < indexCount; i += 3)
{
const int ia = indices[i];
const int ib = indices[i + 1];
const int ic = indices[i + 2];
const glm::vec3 e1 = glm::vec3(vert[ia].position) - glm::vec3(vert[ib].position);
const glm::vec3 e2 = glm::vec3(vert[ic].position) - glm::vec3(vert[ib].position);
const glm::vec3 no = cross(e1, e2);
vert[ia].normal += glm::vec4(no, 0.0);
vert[ib].normal += glm::vec4(no, 0.0);
vert[ic].normal += glm::vec4(no, 0.0);
}
for (int i = 0; i < vertexCount; i++)
vert[i].normal = glm::vec4(glm::normalize(glm::vec3(vert[i].normal)), 0.0f);
}
此外,在调用此函数之前,我必须循环遍历所有顶点并通过将法线设置为 vec3(0) 来清除先前的法线。
如何加快速度?有没有更好的算法?还是 GLM 很慢?
【问题讨论】:
标签: c++ algorithm optimization mesh normals