大家好,我在iPhone上的opengles渲染功能中有一个概念性的问题。说我有一个立方体。立方体有6个面,因此有12个三角形。如果我计算每个三角形的法线,我有12个法线,每个法线都有x,y,z坐标。因此,我有一个36个花车阵列。在我的渲染函数中,我想将x,y,z坐标传递给顶点以进行一些与光照相关的计算。这是我实现这一目标的号召
glVertexAttribPointer(_simpleLightNormalAttribute, 3, GL_FLOAT, GL_FALSE, sizeof(float), duplicateNormals);
索引0,1,2包含第一个三角形的x,y,z坐标,依此类推。 opengl如何知道索引2,3,4包含2个三角形的x,y,z坐标?
非常感谢任何帮助/
答案 0 :(得分:1)
OpenGL不像你那样定义顶点。在经典的固定管道OpenGL中,单个顶点是位置和/或法线和/或颜色和/或纹理坐标。
因此法线与顶点相关联,而不是与多边形相关联。换句话说,如果你正在提供法线,你通常需要为它所依赖的每个面单独提供每个顶点。
因此,对于立方体,您应该提供24个顶点,分为六组,每组四个。每组中的所有顶点将具有相同的正常但不同的位置。
增加:
在ES 2中,基本上适用相同的规则:所有属性都是每个顶点,并在您指定的这些面上进行插值。因此,您仍然无法确定每个面部的属性。例外情况是您可以随意更换制服,因此在您的情况下,您可以使用制服作为法线,尽管您最终会绘制两个三角形,更改制服,再绘制两个三角形,再次更改制服等,这将是一种非常低效的方式。
所以你可能仍然需要24个顶点 - 每个面部每个位置一个。
答案 1 :(得分:0)
如果你分别传递每个三角形的顶点(正如OpenGL游戏项目那样,而你似乎正在做)而不是使用索引,那么你需要为每个顶点指定一个法线。对于具有清晰边缘的立方体,您可能希望为面上的每个顶点发送相同的垂直法线。
如果你真的想要/需要指定更少的法线,你应该考虑使用索引。然后,您将在多维数据集中定义8个不同的顶点,与它们一起定义的8个法线,并使用顶点的索引数组定义三角形。请记住,通过这种方法,您将拥有多个共享法线的面孔。如果你想要一个平滑的灯光效果(如曲线),或者如果你想要清晰明确的边缘(比如立方体)那么这可能是一件好事。
希望这有帮助