在OpenGL的CPU中生成平滑法线

时间:2018-08-14 19:00:59

标签: graphics opengl-es-2.0 normals

我试图在项目中替换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生成的法线。

generated normals

smoothed normals with Assimp

Assimp's generated normals

0 个答案:

没有答案