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