2016-12-04 11 views
0

주름 각을 고려하여 정점 별 가중치 법선을 계산하려고합니다. 그러나 게임에 많은 (> 12) 메쉬 개체가있어 코드가 실행되는 데 영원히 걸립니다. 주름 각을 염두에두고 버텍스 가중치 법선을 계산하는 더 좋은 방법이 있습니까?OpenGL C++의 주름 각을 염두에두고 정점 별 가중치를 계산합니다.

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]]); 
       } 
      } 
     } 
    } 
} 

답변

0

귀하의 코드가 차 실행 시간에 결과를 중첩 루프를 가지고 :

다음은이를 보여주는 코드의 조각이다. 인접 그래프를 작성해야합니다. 각 정점에 대해 인접한면을 목록에 추가 한 다음 해당 그래프로 이동하십시오. 이것은 실행 시간을 선형으로 줄입니다.