2012-02-16 23 views
9

我想在OpenGL ES 2.0中显示网格模型,它清楚地显示了实际的网格,所以我不想在每个基元/三角形上平滑着色。我能想到的只有两个选项是我可以在OpenGL ES中为每个人脸指定正常并实现非平滑/平坦的阴影吗?

  1. 每个三角形都有自己的一套法线,所有垂直于三角形表面(后来我想我不能使用此选项三角形间共享顶点)
  2. 使用黑色线表示三角形/原始边缘和粘到正常的方式使用共享顶点和一个正常的每个顶点

是否有要这样?为什么我不能简单地阅读原语并且没有指定任何法线,并且让OpenGL ES 2.0在每个面上做出平坦的阴影?

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

+0

你找到了答案吗? – 2012-05-09 04:49:10

回答

7

因为为了对你的网格底纹(任意,光滑或平面),你需要一个光照模型,和OpenGL ES不能猜测它。 GL ES 2中没有固定的流水线,因此您无法使用任何内置函数(可使用内置照明模型)为您完成这项工作。

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

然后,GPU以非常平行的方式工作,同时处理几个顶点(然后是碎片)。为了高效,它不能在顶点之间共享数据。这就是为什么你需要为每个顶点复制法线。如你所说,你的网格不能在三角形之间共享顶点,因为它们只共享顶点位置,而不是顶点法线。所以你需要把3 * NbTriangles顶点放在你的缓冲区中,每个有一个位置和一个正常。你不能使用三角形条/风扇的好处,因为你的脸不会有一个共同的顶点与另一个(因为,再次,不同的法线)。

+0

OpenGL(非ES)也是如此吗? – Rick 2015-12-09 08:13:27

+0

OpenGL有一个传统的固定管道,但不建议使用它。有关详细信息,请参阅此文章:https://www.opengl.org/wiki/Fixed_Function_Pipeline – Benlitz 2015-12-09 09:32:40

+0

谢谢。我想要的是在OS X 10.10(或10.11)中使用SceneKit来传递一个共享顶点数组,三角形的一系列索引,并使其平坦。在它下面使用OpenGL或金属,但我不知道任何一方。这位作者(http://ronnqvi.st/custom-scenekit-geometry/)似乎认为这不是OpenGL可以做的事情,所以我一直在寻找是否可以,这就是我如何找到这个问题。 – Rick 2015-12-09 10:00:31