VertexArrayObject,我如何设置"默认"属性值?

时间:2015-04-18 20:59:12

标签: opengl attributes shader vao

我正在开发一个OpenGL应用程序,我正在努力让ShaderPrograms和VAO相互独立。说独立我的意思是ShaderProgram和VAO都可以有不同的属性集。

创建新的ShaderProgram时,即使着色器不使用它们,我也会将已知属性列表显式绑定到预定义的位置。

  BindAttributeLocation(program, StandardAttribute.Position, PositionAttributeName);
  BindAttributeLocation(program, StandardAttribute.Color, ColorAttributeName);
  BindAttributeLocation(program, StandardAttribute.Normal, NormalAttributeName);
  BindAttributeLocation(program, StandardAttribute.TexCoord, TexCoordAttributeName);
  BindAttributeLocation(program, StandardAttribute.Tangent, TangentAttributeName);

我正在尝试使用VAO,但如果网格不包含属性数据,我想设置默认值:

vao.Bind();
if(mesh.Color == null) {
    DisableVertexAttribArray(attribute);
    VertexAttrib4f(attribute, 1, 1, 1, 1);
}
else {
    EnableVertexAttribArray(attribute);
    buffer.Bind();
    BufferData(mesh.Color);
    VertexAttribPointer(attribute, ...);
}

此代码似乎正在运行(到目前为止),但我不确定这是否是正确的方法。 VertexAttrib4f在哪里存储数据:在VAO中,还是上下文全局状态,我需要在每次绘制调用后重置它?

2 个答案:

答案 0 :(得分:4)

当前属性值是VAO状态的一部分。规范中最明确的陈述证实了这一点在glGetVertexAttrib()的描述中(强调增加):

  

请注意,所有查询 CURRENT_VERTEX_ATTRIB之外的返回值都存储在当前绑定的顶点数组对象中

其中CURRENT_VERTEX_ATTRIB是您使用glVertexAttrib4f()设置的值。

这意味着值是全局上下文状态。

答案 1 :(得分:3)

好的,我找到了关于此的好文章:opengl.org

  

顶点着色器可以读取当前未启用的属性   (通过glEnableVertexAttribArray)。它获得的值由。定义   特殊上下文状态,它是 VAO的一部分。

     

因为属性是由上下文状态定义的,所以它是常量   单个抽奖电话的过程。每个属性索引都有一个单独的   值。警告:每次发出带有数组的绘图命令   启用后,相应的上下文属性值将变为未定义。   因此,如果您想要,例如,使用非数组属性索引3   之前在索引3中使用数组之后,需要反复进行   将其重置为已知值。

     

这些的初始值是浮点(0.0,0.0,0.0,1.0)。