我想在 OpenGL ES 2.0 中显示网格模型,它清楚地显示了实际的网格,所以我不想在每个基元/三角形上进行平滑着色。我能想到的唯一两个选择是
- 每个三角形都有自己的一组法线,都垂直于三角形表面(但我想我不能用这个选项在三角形之间共享顶点)
- 使用黑线表示三角形/原始边,并坚持使用共享顶点的法线方式,每个顶点都有一个法线
一定要这样吗?为什么我不能简单地读取图元并且不指定任何法线并以某种方式让 OpenGL ES 2.0 在每个面上制作平坦的阴影?
我想在 OpenGL ES 2.0 中显示网格模型,它清楚地显示了实际的网格,所以我不想在每个基元/三角形上进行平滑着色。我能想到的唯一两个选择是
一定要这样吗?为什么我不能简单地读取图元并且不指定任何法线并以某种方式让 OpenGL ES 2.0 在每个面上制作平坦的阴影?
因为为了在您的网格上进行着色(任何,平滑或平坦),您需要一个光照模型,而 OpenGL ES 无法猜测它。GL ES 2 中没有固定的管道,因此您不能使用任何可以为您完成工作的内置函数(使用内置照明模型)。
在平面着色中,整个三角形将使用相同的颜色绘制,根据其法线与光源之间的角度计算(是的,您还需要一个光源,它可能只是透视图的原点)。这就是为什么每个三角形至少需要一个法线。
然后,GPU 以非常并行的方式工作,同时处理多个顶点(然后是片段)。为了提高效率,它不能在顶点之间共享数据。这就是为什么您需要为每个顶点复制法线的原因。
此外,您的网格不能再像您所说的那样在三角形之间共享顶点,因为它们只共享顶点位置,而不是顶点法线。所以你需要把3 * NbTriangles
顶点放在你的缓冲区中,每个顶点都有一个位置和一个法线。您也不能享受使用三角形带/扇形的好处,因为您的所有面都不会与另一个面有共同的顶点(因为同样,不同的法线)。