【问题标题】:VertexArrayObject, how can i set "default" attribute value?VertexArrayObject,如何设置“默认”属性值?
【发布时间】: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 中,还是上下文全局状态,我需要在每次绘制调用后重置它?

【问题讨论】:

    标签: opengl attributes shader 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)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多