GL_CURRENT_VERTEX_ATTRIB-文档澄清

时间:2020-09-01 13:32:46

标签: opengl

OpenGL 4 docs说:

GL_CURRENT_VERTEX_ATTRIB

params返回代表当前值的四个值。 由索引指定的通用顶点属性。通用顶点属性 0是唯一的,因为它没有当前状态,因此会出现错误 如果index为0,则生成。所有其他泛型的初始值 顶点属性为(0,0,0,1)。

在实践中“如果索引为0将产生错误”是什么意思?

让我们假设我有一个具有以下布局的顶点着色器:

layout (location = 0) in vec3 pos;

我想设置一个通用(恒定)顶点属性。 我可以使用索引等于0的glVertexAttrib3f吗?

glVertexAttrib3f(0, 1, 0, 0);

稍后,我想通过以下方式检查当前的顶点属性:

glGetVertexAttribfv(0, GL_CURRENT_VERTEX_ATTRIB, data);

对吗?

1 个答案:

答案 0 :(得分:5)

相对于核心OpenGL 3.2或更高版本,文档中的文本不正确。在OpenGL的核心配置文件中,属性0具有状态,并且可以查询该状态。

compatibility 概要文件(最多4.5)(以及3.0之前的所有GL版本)中,属性0没有状态。 4.5更改了兼容性配置文件以赋予属性0状态。确实,该规范明确地称这种改变为:

这是兼容性配置文件行为的变化,旨在增强与核心配置文件和OpenGL ES的互操作性。

说了这么多,您真的应该假装通用属性值不存在。由于它们很少使用,因此它们的性能特征是未知的。它们的价值有些短暂。如果您设置了一个值,先渲染,然后渲染使用该属性数组的东西,则先前设置的值将不会保留,需要您再次设置。这与大多数OpenGL状态完全不同。

相关问题