我假设这将是“未定义”的事情之一,但我似乎无法从谷歌找到具体的答案。
假设在我的顶点着色器中我有:
layout(location = 0) in vec3 vPosition;
layout(location = 1) in vec3 vNormal;
layout(location = 2) in vec4 vColour;
但是没有任何东西用 glEnableVertexAttribArray() 或 glVertexAttribPointer() 缓冲到位置 2。我可以期望值是什么特别的吗?
我假设 vec4 将沿着 {0,0,0,0}、{0,0,0,1} 或 {1,1,1,1} 的线,但在我的情况下是{0,0,1,1}。
当我之前使用 glBindAttribLocation() 指定位置时,它在使用 3 种不同操作系统(ubuntu 12.04、windows 7 和 ubuntu 10.04)的 4 台不同机器上默认为 {1,1,1,1}。
假设跨机器的值将是 {0,0,1,1} 是否安全?或者这只是一个巧合?
最佳答案
Can I expect the value to be anything particular?
是的,这是一个特殊的值。
假设您正确关闭了属性数组(即:在该属性索引上使用
glDisableVertexAttribArray
),您获得的值来自 in-context vertex attribute ,由 glVertexAttrib
函数套件设置。这些是全局上下文状态,不存储在 VAO 中。默认情况下,它们都从 (0, 0, 0, 1) 开始。但是,如果您使用该属性索引中的数组使用特定属性进行渲染,则上下文值将被有效地破坏。所以如果你想使用它,你应该重置上下文值。
关于使用布局限定符时未缓冲顶点属性的 OpenGL 默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819034/