每个顶点加权正常,请记住OpenGL C 的折痕角度
Per vertex weighted normal keeping in mind the crease angle in OpenGL C++
我正在尝试计算每个顶点加权正:折痕角度。但是,由于我在游戏中有很多(> 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]]);
}
}
}
}
}
您的代码具有嵌套循环,可导致二次运行时间。相反,您应该构建一个邻接图 - 对于每个顶点,将相邻面添加到列表中,然后浏览该图。这将减少线性的运行时间。
相关文章:
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 了解 GLM- openGL 中的相机转换
- 如何在全屏模式下(在OpenGL中)使背景透明
- 为什么我不能使用 EGL 创建无头 OpenGl 上下文?
- OpenGL大的3D纹理(>2GB)非常慢
- OpenGl glm rotate
- C++atioglxx.pdb未加载错误glBufferData OpenGL
- OpenGL在启用深度测试时不会丢弃我的碎片
- OpenGL相机和相机空间转型的困惑
- OpenGL将纹理四边形渲染为(0,0)
- OpenGL 和 GLM 矩阵无法正确扩展,总是按比例缩小
- 发布旋转矩阵(openGL/glm)
- 如何在Visual Basic中使用矩形函数OpenGL绘制矩形
- 无法使用VAO和EBO(openGL)绘制多个对象
- 为什么我的点没有在 OpenGL 中绘制鼠标所在的位置?
- OpenGL 16 位模板缓冲区?
- 将QOpenGLWidget子类转换为使用Metal而不是OpenGL的子类是否可行?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 在 openGL 中多次绑定缓冲区
- 每个顶点加权正常,请记住OpenGL C 的折痕角度