【问题标题】:What does glDrawElements() expect the normals array to contain?glDrawElements() 期望法线数组包含什么?
【发布时间】:2011-09-15 07:26:03
【问题描述】:

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

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

所以我想我搞乱了顺序。怎么做才对? 感谢阅读。

【问题讨论】:

    标签: arrays opengl


    【解决方案1】:

    OpenGL 假定被索引的法线与顶点位置相同。必须理解,顶点本身是属性向量的向量,或者换句话说是所有属性值(位置、法线、颜色、纹理坐标等)的向量。 glDrawElements 索引数组寻址顶点数组,其中每个顶点都是这样一个更高维的向量。

    现在可能发生的情况是,Milkshape 混合了面绕组并为您提供了一些已被翻转到相反方向(向内而不是向外)的法线。我不知道它在 Milkshape 中是如何完成的,但是在 Blender 中有一个函数“重新计算法线”(通过 CTRL+N 热键访问)可以解决这个问题。

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

    glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
    

    【讨论】:

      【解决方案2】:

      您所描述的听起来像是 MilkShape3D 为您提供了每个面的法线。 OpenGL 需要每个顶点的法线。

      因此,您需要处理数据以从每个面生成每个顶点。网络上有很多关于这方面的文献,在 Google 上一击给出this

      【讨论】:

        【解决方案3】:

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

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

        1. 顶点列表,float[3]
        2. 三角形的顶点索引列表为short[3] + 3 个法线为float[3] 每个

        您需要在normals[currentFace.index123] 加载法线。简单来说,normals 数组中的法线索引必须对应于vertices 数组中的顶点索引。

        【讨论】:

          猜你喜欢
          • 2021-12-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多