opengl - GL_CURRENT_VERTEX_ATTRIB - 文档说明

标签 opengl

OpenGL 4 docs说:

GL_CURRENT_VERTEX_ATTRIB

params returns four values that represent the current value for the generic vertex attribute specified by index. Generic vertex attribute 0 is unique in that it has no current state, so an error will be generated if index is 0. The initial value for all other generic vertex attributes is (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);

正确吗?

最佳答案

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

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

This is a change in behavior of the compatibilty[sic] profile for increased interoperability with core profile and OpenGL ES.

综上所述,您确实应该假装通用属性值不存在。由于它们很少使用,因此它们的性能特征尚不清楚。它们的值(value)有些短暂;如果您设置一个值,渲染某些内容,然后渲染使用该属性的数组的某些内容,则您之前设置的值将不会保留,需要您再次设置。这与大多数 OpenGL 状态完全不同。

关于opengl - GL_CURRENT_VERTEX_ATTRIB - 文档说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63688776/

相关文章:

c++ - VBO 和 glTranslatef 是否需要将 GLSL 着色器中的 gl_vertex 与某些东西相乘?

c++ - 在 Qt 中将 x 可执行文件作为按钮事件运行时出错

c++ - 在windows + opengl中选择图形设备

opengl - SDL2 和 3D 渲染

opengl - XNA是否支持OpenGL

c++ - 未知的 OpenGL 错误

c++ - OpenGL 3.3 中的多纹理和多光源

python - 在 Python 中创建向前兼容的 OpenGL 3.x 上下文

c++ - 为什么我的 opengl 场景有深度缓冲问题?

c++ - 从顶点着色器中修改着色器存储缓冲区对象