glDrawElements()期望normals数组包含什么?

时间:2011-09-15 07:26:04

标签: arrays opengl

我正在为MilkShape 3D模型编写解码器。 我将内容加载到顶点数组和面索引数组(作为std::vector),然后使用glDrawElements()进行渲染,到目前为止一直很好。

但问题在于normals数组。 OpenGL以什么顺序期望法线? MilkShape 3D文件包含三个float[3]法线,这些法线遵循面(三角形)索引。但是,如果我只是push_back()我读到法线数组的内容,OpenGL将无法正确应用光照。

所以我觉得我搞砸了订单。怎么做对了? 谢谢你的阅读。

3 个答案:

答案 0 :(得分:1)

OpenGL假设法线的索引与顶点位置非常相似。必须理解,顶点本身是属性向量的向量,或者换句话说,是所有属性值(位置,法线,颜色,纹理坐标等)的向量。 glDrawElements索引数组处理顶点数组,其中每个顶点都是一个更高维度的向量。

现在可能发生的是,Milkshape混合了面部缠绕并给出法线,其中一些已被翻转到相反的方向(向内而不是向外)。我不知道它是如何在Milkshape中完成的,但在Blender中有一个函数“Recalculate Normals”(由CTRL + N热键访问),修复了这个问题。

如果您不想修复法线,则必须启用双面照明(这会对性能产生影响)。

glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);

答案 1 :(得分:0)

你所描述的听起来像MilkShape3D的每个法庭给你一个法线。 OpenGL期望每顶点法线。

因此,您需要处理数据以从每个面生成每个顶点。网上有很多关于此的文献,谷歌上的一篇文章给出this

答案 2 :(得分:0)

我确实弄乱了法线的顺序。

MilkShape 3D模型文件结构可近似为:

  1. 顶点列表,float[3]
  2. 顶点索引列表为short[3]为三角形+ 3法线为float[3]每个
  3. 您需要在normals[currentFace.index123]加载法线。简单来说,normals数组的法线索引必须与vertices数组的顶点索引相对应。