首页 > 解决方案 > GL_CURRENT_VERTEX_ATTRIB - 文档说明

问题描述

OpenGL 4 文档说:

GL_CURRENT_VERTEX_ATTRIB

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

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

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

layout (location = 0) in vec3 pos;

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

glVertexAttrib3f(0, 1, 0, 0);

稍后我想以这种方式检查当前顶点属性:

glGetVertexAttribfv(0, GL_CURRENT_VERTEX_ATTRIB, data);

这是正确的吗 ?

标签: opengl

解决方案


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

在最高 4.5 的兼容性配置文件(以及 3.0 之前的所有 GL 版本)中,属性 0 没有状态。4.5 更改了兼容性配置文件以赋予属性 0 状态。确实,规范特别指出了这种变化:

这是兼容性[原文如此] 配置文件行为的更改,以增加与核心配置文件和 OpenGL ES 的互操作性。

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


推荐阅读