我试图在项目中替换Assimp并制作一个自定义对象加载器。
提供aiProcess_GenNormals
标志时,Assimp从顶点生成法线。给定aiProcess_GenSmoothNormals
时,它还会生成平滑的法线。
现在,我正在从顶点生成法线,但无法使它们平滑。
我发现these two个帖子说将正常的总和除以索引中的重复计数。我曾尝试这样做,但无法使其正常工作。
int i, c;
for (i = 0; i < triangles.size(); i++) {
Traingle& tri = triangles[i];
glm::vec3 v1 = vertices[tri.indices[0]].position;
glm::vec3 v2 = vertices[tri.indices[1]].position;
glm::vec3 v3 = vertices[tri.indices[2]].position;
glm::vec3 delta1 = v2 - v1;
glm::vec3 delta2 = v3 - v1;
glm::vec3 normal = glm::cross(delta1, delta2);
for (c = 0; c < 3; c++) {
vertices[tri.indices[c]].normal += normal;
vertices[tri.indices[c]].count += 1.0f;
}
}
for (i = 0; i < vertices.size(); i++) {
Vertex& ver = vertices[i];
glm::vec3 normal = glm::normalize(ver.normal / ((float)vertices[i].count));
smoothNormals.push_back(normal);
}
我还查看了Assimp's source,以了解他们是如何做到的,并看到他们使用了特殊的空间排序树。
我必须做他们怎么做,还是有另一种平滑CPU中法线的方法?
编辑:我正在绘制法线。第一张图片是使用上述代码生成的法线,第二张图片是Assimp平滑后的法线。第三个是Assimp生成的法线。