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,如何设置“默认”属性值?的主要内容,如果未能解决你的问题,请参考以下文章