我昨晚在OpenGL 4.1中组装了一个小型演示,并意外省略了我的顶点位置的布局限定符:
layout(location = 0) in vec3 position;
即使我在顶点着色器中忘记了这一行,一切正常。顺便说一下,我只使用一个属性。这种行为是在标准中还是我在实施中幸运?
答案 0 :(得分:3)
GLSL标准说
如果在着色器文本中未指定位置的顶点着色器输入变量指定了位置 通过OpenGL API,将使用API分配的位置。 否则,这些变量将是 链接器分配了一个位置。
所以问题就变成了你的其他程序。是否有对glBindAttribLocation
或glGetAttribLocation
的任何电话?
如果没有,你很幸运。这是OpenGL 4.1核心所说的(第2.11节):
当程序链接时,没有通过BindAttribLocation指定的绑定或在着色器文本中显式设置的任何活动属性将自动绑定到GL的顶点属性。可以使用命令GetAttribLocation查询此类绑定。 如果指定的活动属性变量绑定将导致GL引用不存在的通用属性(大于或等于MAX_VERTEX_ATTRIBS的值),则LinkProgram将失败。
并且对规范其余部分的略读表明没有关于属性位置分配的讨论,这意味着选择绑定需要一些未定义的机制。