【问题标题】:Can I specify per face normal in OpenGL ES and achieve non-smooth/flat shading?我可以在 OpenGL ES 中指定每个面法线并实现非平滑/平坦着色吗?
【发布时间】:2012-03-07 19:42:20
【问题描述】:

我想在 OpenGL ES 2.0 中显示网格模型,它清楚地显示了实际的网格,所以我不想在每个图元/三角形上进行平滑着色。我能想到的唯一两个选择是

  1. 每个三角形都有自己的一组法线,所有法线都垂直于三角形表面(但我想我无法使用此选项在三角形之间共享顶点)
  2. 用黑线表示三角形/原始边,并坚持使用共享顶点的法线方式,每个顶点都有一条法线

一定要这样吗?为什么我不能简单地读入图元,不指定任何法线,让 OpenGL ES 2.0 在每个面上制作一个平面阴影?

类似问题Similar Stackoverflow question, but no suggestion to solution

【问题讨论】:

  • 你找到答案了吗?

标签: opengl-es-2.0 normals


【解决方案1】:

因为为了在您的网格(任何平滑或平坦)上添加阴影,您需要一个光照模型,而 OpenGL ES 无法猜测它。 GL ES 2 中没有固定的管道,因此您不能使用任何可以为您完成工作的内置函数(使用内置照明模型)。

在平面着色中,整个三角形将使用相同的颜色绘制,根据其法线与光源之间的角度计算(是的,您还需要一个光源,它可能只是透视图的原点) .这就是为什么每个三角形至少需要一个法线。

然后,GPU 以非常并行的方式工作,同时处理多个顶点(然后是片段)。为了提高效率,它不能在顶点之间共享数据。这就是您需要为每个顶点复制法线的原因。

另外,你的网格不能再像你说的那样在三角形之间共享顶点,因为它们只共享顶点位置,而不是顶点法线。因此,您需要将3 * NbTriangles 顶点放在缓冲区中,每个顶点都有一个位置和一个法线。你也不能享受使用三角带/扇形的好处,因为你的脸都不会与另一个脸有共同的顶点(因为,同样,不同的法线)。

【讨论】:

  • OpenGL(非 ES)也是如此吗?
  • OpenGL 有一个遗留的固定管道,但不建议使用它。有关更多信息,请参阅本文:opengl.org/wiki/Fixed_Function_Pipeline
  • 谢谢。我想要做的是在 OS X 10.10(或 10.11)中使用 SceneKit 来传递共享顶点数组、三角形索引数组,并使其平淡。在它下面使用 OpenGL 或 Metal,但我对任何一个都不太了解。这位作者 (ronnqvi.st/custom-scenekit-geometry) 似乎认为这不是 OpenGL 可以做到的,所以我一直在寻找它是否可以,这就是我发现这个 SO 问题的方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多