我可以在OpenGL ES中指定每个面法线并实现非平滑/平面着色吗?

Chr*_*sen 9 normals opengl-es-2.0

我想在OpenGL ES 2.0中显示网格模型,它清楚地显示了实际的网格,所以我不希望在每个基元/三角形上有平滑的阴影.我能想到的唯一两个选择是

  1. 每个三角形都有自己的法线集,都垂直于三角形表面(但我想我不能用这个选项在三角形之间共享顶点)
  2. 使用黑色线条指示三角形/基本边缘,并使用共享顶点和每个顶点的一个法线以常规方式粘贴

它必须是这样的吗?为什么我不能简单地阅读原语并且不指定任何法线,并且以某种方式让OpenGL ES 2.0在每张脸上做出平坦的阴影?

类似的问题类似Stackoverflow问题,但没有解决方案的建议

Ben*_*itz 7

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

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

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

此外,正如您所说,您的网格不能再在三角形之间共享顶点,因为它们只共享顶点位置,而不是顶点法线.因此,您需要将3 * NbTriangles顶点放在缓冲区中,每个顶点都有一个位置和一个法线.你不能拥有使用三角形条/扇形的好处,因为你的任何一个面都没有一个共同的顶点与另一个(因为,同样,不同的法线).