VertexArrayObject,如何设置“默认”属性值?

Posted

技术标签:

【中文标题】VertexArrayObject,如何设置“默认”属性值?【英文标题】:VertexArrayObject, how can i set "default" attribute value? 【发布时间】:2015-04-18 20:59:11 【问题描述】:

我正在开发一个 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 中,还是上下文全局状态,我需要在每次绘制调用后重置它?

【问题讨论】:

【参考方案1】:

当前属性值不是 VAO 状态的一部分。规范中确认这一点的最清晰的声明是在glGetVertexAttrib() 的描述中(强调添加):

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

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

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

【讨论】:

【参考方案2】:

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

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

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

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

【讨论】:

以上是关于VertexArrayObject,如何设置“默认”属性值?的主要内容,如果未能解决你的问题,请参考以下文章

初识OpenGL (-)VAO顶点数组对象

初识OpenGL (-)VAO顶点数组对象

初识OpenGL (-)VAO顶点数组对象

redmine默认设置如何修改

vs2008如何恢复默认设置

DEV控件的LookUpEdit如何设置默认值