iPhone opengl es:概念知识

iPhone opengl es:概念知识,iphone,opengl-es,Iphone,Opengl Es,大家好,我有一个关于iPhone上opengles渲染功能的概念性问题。假设我有一个立方体。立方体有6个面,因此有12个三角形。如果我为每个三角形计算一条法线,我有12条法线,每条法线有x,y,z坐标。因此,我有一个36个浮点数的数组。在我的渲染函数中,我希望将x、y、z坐标传递到顶点,以便进行一些与照明相关的计算。这是我实现这一目标的使命 glVertexAttribPointer(_simpleLightNormalAttribute, 3, GL_FLOAT, GL_FALSE, si

大家好,我有一个关于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坐标


任何帮助都将不胜感激。

OpenGL并不像您那样定义顶点。在经典的固定管道OpenGL中,单个顶点是位置和/或法线和/或颜色和/或纹理坐标

因此法线与顶点关联,而不是与多边形关联。从另一个角度来看,如果要提供法线,通常需要为其所在的每个面分别提供每个顶点

因此,对于立方体,您应该提供24个顶点,分为六组,每组四个。每组中的所有顶点将具有相同的法线但不同的位置

补充:

在ES 2中,基本上适用相同的规则:所有特性都是逐顶点的,并按指定在这些面上插值。因此,您仍然无法真正指定每个面的属性。例外情况是,你可以随意更换制服,因此在你的情况下,你可以使用制服作为法线,尽管你最终会画两个三角形,改变制服,再画两个三角形,再次改变制服,等等,这将是一种效率极低的方法


因此,您可能仍然需要24个顶点-每个面每个位置一个。

如果您单独传递每个三角形的顶点(就像OpenGL游戏项目所做的和您似乎正在做的那样),而不是使用索引,那么您需要为每个顶点指定法线。对于具有明确定义边的立方体,您可能希望为面上的每个顶点发送相同的垂直法线

如果你真的想/需要指定更少的法线,你应该考虑使用索引。然后定义立方体中8个不同的顶点,以及与之相应的8条法线,并使用顶点的索引数组定义三角形。请记住,使用这种方法,您将有多个面共享法线。如果您希望获得平滑的照明效果(如曲线),这可能是一件好事;如果您希望获得清晰的边缘(如立方体),这可能是一件坏事


希望这有帮助

很抱歉,我想我应该在使用OpenGL Es 2.0之前提到这一点,它没有固定但可编程的管道。我已经更新了答案,但基本上与以前相同-OpenGL应用顶点着色器来变换所有顶点,然后,在它确定需要绘制的像素上插值指定的任何变量,并因此调用片段着色器来提供颜色。顶点着色器被称为逐顶点一次,而不是逐面一次,因此不提供任何指示,说明下一步将绘制哪个面。好的硬件会缓存顶点着色器的结果。我想我部分理解你的答案,但我的大脑中仍然有一些迷雾。。。我正在三角形带模式下绘制一个立方体==>8个顶点,12个三角形,36个索引到顶点数组中。现在我想为每个顶点提供法线。我想我的法线数组必须包含36条法线?属于一个特定面的所有顶点对于法线具有相同的值?我走对了吗?是的,没错。因此,如果将顶点写成(pos.x,pos.y,pos.z,norm.x,norm.y,norm.z),假设立方体是2x2x2,轴对齐并以原点为中心,则顶点包括(-1,-1,-1,-1,0,0),(-1,-1,0,-1)和(-1,-1,-1,-1,0,0,-1),您可能最终通过
glvertexattributepointer
,提供正常数组,在这种情况下,它将根据您的抽屉元素索引进行索引,就像您提供给
glvertexattributepointer
的所有其他内容一样,例如顶点位置。如果0,1,2是前三个索引,那么前三条法线将是数组中的第一条、第二条和第三条。我想我会分别通过每个三角形的顶点。因此我想每个顶点都需要一条法线。但问题就在这里。每个顶点的法线将根据该顶点所在的三角形而变化。我已经计算了立方体中每个三角形的法线。我的问题是如何存储这些信息,以及如何将这些信息发送到openGL land?