每个顶点加权正常,请记住OpenGL C 的折痕角度

Per vertex weighted normal keeping in mind the crease angle in OpenGL C++

本文关键字:OpenGL 折痕 顶点 加权      更新时间:2023-10-16

我正在尝试计算每个顶点加权正:折痕角度。但是,由于我在游戏中有很多(> 12)网格对象,因此代码将永远运行。tere是否有任何更好的方法来计算每个顶点加权正态,牢记折痕角度?

以下是显示它的代码:

if (cosCreaseAngle == 0) { // ignore crease angle, just average all the nermoals keeping area in mind
    float area = 0;
    for (long pos = 0; pos < m->face_index_vertex.size(); pos++) {
        int firstVertex = pos - pos % 3;
        area = calcTriangleArea(m->dot_vertex[m->face_index_vertex[firstVertex]], m->dot_vertex[m->face_index_vertex[firstVertex + 1]], m->dot_vertex[m->face_index_vertex[firstVertex + 2]]);
        m->dot_normalPerVertexWeighted[m->face_index_vertex[pos]] +=
            area*(m->dot_normalPerFace[m->face_index_normalPerFace[pos]]); // multiply by the area
    }
}
else { //average the normals only when the angle between normals is less than the crease angle
    float area = 0;
    for (long pos = 0; pos < m->face_index_vertex.size(); pos++) {
        m->dot_normalPerVertexWeighted[m->face_index_vertex[pos]] = m->dot_normalPerFace[m->face_index_normalPerFace[pos]];
        for (long adjacentFace = pos + 3; adjacentFace < m->face_index_vertex.size(); adjacentFace++) {
            if (m->face_index_vertex[pos] == m->face_index_vertex[adjacentFace]) {
                if (cosCreaseAngle < calcAngleBetweenNormals(m->dot_normalPerFace[m->face_index_normalPerFace[pos]], m->dot_normalPerFace[m->face_index_normalPerFace[adjacentFace]])) {
                    int firstVertex = adjacentFace - adjacentFace % 3;
                    area = calcTriangleArea(m->dot_vertex[m->face_index_vertex[firstVertex]], m->dot_vertex[m->face_index_vertex[firstVertex + 1]], m->dot_vertex[m->face_index_vertex[firstVertex + 2]]);
                    m->dot_normalPerVertexWeighted[m->face_index_vertex[pos]] +=
                        area*(m->dot_normalPerFace[m->face_index_normalPerFace[adjacentFace]]);
                }
            }
        }
    }
}

您的代码具有嵌套循环,可导致二次运行时间。相反,您应该构建一个邻接图 - 对于每个顶点,将相邻面添加到列表中,然后浏览该图。这将减少线性的运行时间。