opengl - GL_CURRENT_VERTEX_ATTRIB - 文档说明
问题描述
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 3.2 或更高版本。在 OpenGL 的核心配置文件中,属性 0 具有状态,并且可以查询该状态。
在最高 4.5 的兼容性配置文件(以及 3.0 之前的所有 GL 版本)中,属性 0 没有状态。4.5 更改了兼容性配置文件以赋予属性 0 状态。确实,规范特别指出了这种变化:
这是兼容性[原文如此] 配置文件行为的更改,以增加与核心配置文件和 OpenGL ES 的互操作性。
说了这么多,你真的应该假装通用属性值不存在。由于它们很少使用,因此它们的性能特征是未知的。而且它们的价值有些短暂;如果你设置了一个值,渲染了一些东西,然后渲染了一个对该属性使用数组的东西,你之前设置的值将不会被保留,需要你再次设置它。这与大多数 OpenGL 状态完全不同。
推荐阅读
- sql - 将 NULL 替换为 0
- mysql - Symfony 5 和 Doctrine,找不到使用 3 个相关实体获取结果的方法
- html - HTML 是否需要在文档末尾换行?
- node.js - 在 fetch 方法中调用 graphql 查询
- java - 消息列表的 RSA 解密速度很慢
- python-sphinx - sphinx:嵌套目录中的嵌套包含
- django - virtualenv中的uwsgi,但django的附加守护进程没有得到venv
- lua - 如何在播放器上放置级联(ESP)?
- c++ - MSBuild - 如何在编译时判断文件是否存在并使用它?
- r - 表格:如何衡量不同日期的维度集的相似性?