在opengl中具有法线的共享顶点索引

时间:2015-05-27 20:14:52

标签: android ios opengl-es

在opengl或opengl-es中,您可以使用索引来共享顶点。如果您只使用不会改变的顶点坐标和纹理坐标,这可以正常工作,但是当使用法线时,顶点上的法线可能会根据面部而改变。这是否意味着您基本上被迫废弃opengl中的顶点共享?这篇文章http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-9-vbo-indexing/ 似乎暗示这是事实,但我想要第二个意见。我使用.obj模型,所以我应该忘记尝试共享顶点?这似乎会增加我的模型的大小,虽然我迭代并重新创建数组,因为我重复了大量的顶点及其tex / normal属性。

2 个答案:

答案 0 :(得分:0)

您发布的链接很好地解释了这种情况。几个月前,我心里也有同样的问题。我记得我读过那个教程。

如果您需要两个不同的法线,那么您应该在索引列表中添加两次该顶点。例如,如果网格是一个立方体,则应该将顶点添加两次。

否则索引一个顶点并计算平均法线就可以平滑网格上的正常过渡。例如,如果您的网格是地形或详细的玩家模型等,您可以使用这种技术,您可以节省空间并获得更好的结果。

如果你问如何计算平均法线,我使用this question的平均法线计算算法,结果快速而且好。

答案 1 :(得分:0)

如果法线是平面,则可以使用“平面”限定符在片段着色器中注释变化的用法。这意味着只使用来自激发顶点的值。有了一个好的模型导出器,你就可以获得相对较好的顶点共享。

不确定GLES2的可用性,但是GLES3的一部分。

示例:想象两个三角形,表示为三条带:

V0 - Norm0 
V1 - Norm1 
V2 - Norm2
V2 - Norm3

你的两个三角形是V0 / 1/2和V1 / 2/3。如果将法线的变量变量标记为“平坦”,则第一个三角形将使用Norm0,第二个三角形将使用Norm1(即只有三角形中的第一个顶点 - 称为激发顶点 - 需要具有正确的法线) 。这意味着您可以安全地重复使用其他三角形中的顶点,即使法线是“错误的”,也可以确保它不是该三角形的激发顶点。