【问题标题】:OpenGL vertex normal weighting?OpenGL顶点法线加权?
【发布时间】:2017-08-06 17:53:47
【问题描述】:

我正在尝试从文件中读取顶点和面信息并计算顶点法线。我已经阅读了很多其他答案,但我仍然不确定我是否理解。共识是顶点法线应该是周围面法线的平均值,这乍一看是有道理的。对于立方体,法线都应该是 45 度。那正确吗?因为只有当三角形以每个顶点共享 3 个或 6 个“面”的方式排列时,才会这样计算。

问题:

如果一个立方体有一个顶点,比如 4 个三角形,我应该以某种方式对它们进行加权,以使法线在 45 度处出现。或者我应该总结面部法线? OpenGL是否期望顶点法线向具有2个三角形的面倾斜更多?另外,我应该在求和之前对面部法线进行归一化吗?

【问题讨论】:

  • 对于立方体,您不需要任何平滑法线。你想要硬边。
  • 我正在从一个文件中读取,立方体只是一个例子,OPENGL 如何期望顶点法线?
  • OpenGL 没有对法线的外观定义任何限制。实际上,“正常”一词在当前的 OpenGL 4.5 规范中并没有以任何方式定义。您基本上可以根据最适合您的数据/最适合您的数据来计算它们。
  • @BDL 所以,如果我有一个带有 3 个周围多边形面的顶点,每个面由 2 个三角形组成......我们就说一个立体角。不管三角形如何排列,OpenGL 会做同样的着色吗?或者,如果 2 个面有 1 个三角形接触顶点,而第三个面被 2 个接触,这是否会以不同的方式绘制到相同形状的顶点(可以这么说)但被 3 个三角形(不是 4 个)接触?我认为前者是这样,但正如许多人所说的那样,平均面部法线也许三角形的数量确实会影响事物。
  • @immibis 是的,感谢您的贡献和其中的丰富信息。更不用说你的智慧了。

标签: opengl 3d vertex


【解决方案1】:

现代 OpenGL(版本 >= 3)对法线一无所知。是您在着色器中使用它们来执行着色等操作。这个概念是处理法线方向和光线方向。

如果你的三角形是平的,它只需要一个法线,三角形内的每个点都一样。如果您想要一些“曲线”效果,您可以在每个顶点设置不同的法线,然后查看将每个点的法线插入到顶点的法线之间时的效果。

如果您的模型是平滑的,两个三角形之间没有可见的边,那么两个并排三角形的法线可以被认为是相同的法线。

如果您的着色器读取法线的方式与读取顶点的方式相同,那么您必须为每个三角形提供三个法线。如果它们是相同的法线,你有一个平坦的三角形,否则你会得到另一个效果。

如果您的模型是平滑的,那么顶点的法线应该与相邻点的法线相同。这意味着您从近点/三角形的法线计算加权法线。立方体不是光滑的,因此每个面的法线与相邻三角形无关。

【讨论】:

  • 感谢您抽出宝贵时间回复。我想我明白了。唯一完成的计算是我的着色器中的计算,除了在相邻点之间插入法线和颜色的地方。如果我使用指向交错数据的索引(每个顶点 1 个法线)为立方体构建网格,我必须重复每个顶点 3 次。但是,我的顶点描述了一个圆柱体在同一位置以不同的法线重复一个顶点会导致多面螺栓,但每个顶点有 1 个法线将意味着法线在整个面上逐渐变化,更好地逼近曲线。对吗?
  • 对。对这两种情况都进行编码,您会看到的。
  • 感谢清理。顺便说一句,插值过程是“光栅化”还是其他东西/完全不同的东西?
  • khronos.org/opengl/wiki/Rasterization 。片段着色器中的每个“入值”(颜色、法线等)都是从前一个着色器(例如顶点着色器)的“出值”中插值的。你可以改变插值的方式;搜索 GLSL flat smoothglProvokingVertex
【解决方案2】:

立方体不能有 4 个三角形的顶点。将这些东西转换为 3d 模型,就像幻觉艺术一样柔软,将模型导出为 .obj 并使用“写入冲浪法线”并编写 obj 加载器(一页 C 代码,链接已发布已经)。

您会看到三角形中的法线不一样。在到达着色器后,它会在所有 3 个顶点之间插值,因此最终每个片段都有一个法线(接近像素)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多