代码之家  ›  专栏  ›  技术社区  ›  leander

通过glvertexattribpointer传递的组件比着色器预期的要少

  •  3
  • leander  · 技术社区  · 14 年前

    在OpenGL中(在本例中特别是ES 2.0),如果每个顶点传递2个组件,会发生什么情况,例如:

      glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, sizeof( MyVertexStruct ), pPos );
    

    …但是材质球需要三个?

    它似乎将第三个组件(在本例中是z)默认为0,这正是我想要的,但我对依赖于该行为犹豫不决。这是在OpenGL、ES或GLSL标准中定义的吗?

    (我的搜索fu失败了:在红皮书、紫皮书或是khronos.org的参考页面上找不到任何东西,但我可能只是忽略了它。)

    1 回复  |  直到 13 年前
        1
  •  2
  •   Christian Rau    13 年前

    尽管我没有在OpenGL规范中找到它,但我很确定它是定义的行为,如果每个属性的组件较少,它就会扩展到(0,0,0,1),就像在使用单个属性函数时那样,比如 glVertexAttrib2f (本标准确实有规定)。

    编辑: 我在OpenGLES2.0规范中查找了它,它说:

    当数组元素i被drawarray或 drawelements命令,每个通用属性扩展为四个 组件。如果大小为1,则属性的x组件为 由数组指定;Y、Z和W组件是隐式设置的 分别为零、零和一。如果尺寸为2,则X和Y 属性的组件由数组指定;z和w 组件分别隐式设置为零和一。中频大小 是3,则指定x、y和z,w隐式设置为 一个。如果大小为4,则指定所有组件。

    所以这确实像你和我猜想的那样。