我想在OpenGL ES 2.0中显示网格模型,它清楚地显示了实际的网格,所以我不希望在每个图元/三角形上有平滑的阴影。我能想到的唯一两个选择是
它必须是这样的吗?为什么我不能简单地阅读原语并且不指定任何法线,并且以某种方式让OpenGL ES 2.0在每张脸上做出平坦的阴影?
类似问题Similar Stackoverflow question, but no suggestion to solution
答案 0 :(得分:7)
因为为了在网格上设置阴影(任何,平滑或平坦),您需要一个照明模型,而OpenGL ES无法猜测它。 GL ES 2中没有固定管道,因此您无法使用任何能够为您完成工作的内置功能(使用内置照明模型)。
在平面着色中,整个三角形将使用相同的颜色绘制,根据其法线和光源之间的角度计算(是的,您还需要一个光源,它可能只是透视图的原点) 。这就是为什么每个三角形至少需要一个法线。
然后,GPU以非常并行的方式工作,同时处理多个顶点(然后是片段)。为了高效,它不能在顶点之间共享数据。这就是你需要为每个顶点复制法线的原因。
此外,正如您所说,您的网格不能再在三角形之间共享顶点,因为它们只共享顶点位置,而不是顶点法线。因此,您需要在缓冲区中放置3 * NbTriangles
个顶点,每个顶点都有一个位置和一个法线。你不能拥有使用三角形条/粉丝的好处,因为你的任何一个面都没有一个共同的顶点与另一个(因为,同样,不同的法线)。