我正在为MilkShape 3D模型编写解码器。
我将内容加载到顶点数组和面索引数组(作为std::vector
),然后使用glDrawElements()
进行渲染,到目前为止一直很好。
但问题在于normals数组。 OpenGL以什么顺序期望法线? MilkShape 3D文件包含三个float[3]
法线,这些法线遵循面(三角形)索引。但是,如果我只是push_back()
我读到法线数组的内容,OpenGL将无法正确应用光照。
所以我觉得我搞砸了订单。怎么做对了? 谢谢你的阅读。
答案 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模型文件结构可近似为:
float[3]
short[3]
为三角形+ 3法线为float[3]
每个您需要在normals[currentFace.index123]
加载法线。简单来说,normals
数组的法线索引必须与vertices
数组的顶点索引相对应。