使用布局限定符时,未缓冲的顶点属性的OpenGL默认值

kbi*_*irk 10 opengl shader attributes vertex-buffer

我假设这将是"未定义"的事情之一,但我似乎无法从谷歌找到具体的答案.

让我们在我的顶点着色器中说:

layout(location = 0) in vec3 vPosition;
layout(location = 1) in vec3 vNormal;
layout(location = 2) in vec4 vColour;
Run Code Online (Sandbox Code Playgroud)

但是没有任何缓冲到位置2的glEnableVertexAttribArray()或glVertexAttribPointer().我可以期待价值是什么特别的吗?

我假设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}是否安全?或者这简直是巧合?

Nic*_*las 11

我可以期待价值是什么特别的吗?

是的,这是一个特殊的价值.

假设您正确关闭了属性数组(即:使用glDisableVertexAttribArray该属性索引),您获得的值来自上下文顶点属性,由glVertexAttrib函数套件设置.这些是全局上下文状态,不存储在VAO中.

默认情况下,它们都从(0,0,0,1)开始.但是,如果使用该属性索引中的数组使用特定属性进行渲染,则会有效地销毁上下文值.因此,如果要使用它,则应重置上下文值.