【问题标题】:GL_CURRENT_VERTEX_ATTRIB - doc clarificationGL_CURRENT_VERTEX_ATTRIB - 文档说明
【发布时间】:2020-09-01 23:01:21
【问题描述】:

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);

对吗?

【问题讨论】:

  • "[...] Generic vertex attribute 0 is unique [...]" - 你能说明你在规范中找到这句话的地方吗? (最新:OpenGL 4.6 API Compatibility Profile Specification
  • @BDL ...但这不是规范。我在规范中找不到这部分。 (10.5 顶点数组和顶点数组对象查询)
  • @Rabbid76:我在规范中也找不到它。奇怪的是它在文档中被提及。
  • "我想设置一个通用(常量)顶点属性。" 这不是你应该想要做的事情。最好假装这些 API 不存在。
  • 作为一个小说明:参考页面中该语句的来源可以在GL 2.0 spec(第259页)中找到:“查询CURRENT VERTEX ATTRIB返回通用属性的当前值索引。在这种情况下,如果索引为零,则会生成错误INVALID OPERATION,因为没有通用属性零的当前值。”属性索引 0 的特殊处理在 2.x 和 4.x 之间多次修改。众所周知,参考页面在 sublte 更新方面非常糟糕。

标签: opengl


【解决方案1】:

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

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

这是为了提高与核心配置文件和 OpenGL ES 的互操作性而改变了兼容性[原文如此] 配置文件的行为。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多