【问题标题】:OpenGL default value for unbuffered vertex attribute when using layout qualifiers使用布局限定符时未缓冲顶点属性的 OpenGL 默认值
【发布时间】:2013-07-23 19:11:49
【问题描述】:

我假设这将是“未定义”的事情之一,但我似乎无法从谷歌找到具体答案。

假设在我的顶点着色器中我有:

layout(location = 0) in vec3 vPosition;
layout(location = 1) in vec3 vNormal;
layout(location = 2) in vec4 vColour;

但是使用 glEnableVertexAttribArray() 或 glVertexAttribPointer() 没有缓冲到位置 2。我可以期望值是什么特别的吗?

我假设 vec4 将沿着 {0,0,0,0}、{0,0,0,1} 或 {1,1,1,1} 的行,但在我的如果是 {0,0,1,1}。

当我之前使用 glBindAttribLocation() 指定位置时,它在使用 3 种不同操作系统(ubuntu 12.04、windows 7 和 ubuntu 10.04)的 4 台不同机器上默认为 {1,1,1,1}。

假设跨机器的值将是 {0,0,1,1} 是否安全?还是这只是巧合?

【问题讨论】:

    标签: opengl attributes shader vertex-buffer


    【解决方案1】:

    我可以期望值是什么特别的吗?

    是的,它是一个特定的值。

    假设您正确关闭了属性数组(即:在该属性索引上使用glDisableVertexAttribArray),您获得的值来自in-context vertex attribute,由glVertexAttrib 设置一套功能。这些是全局上下文状态,不存储在 VAO 中。

    默认情况下,它们都从 (0, 0, 0, 1) 开始。但是,如果您使用该属性索引中的 array 使用特定属性进行渲染,则上下文值将被有效地破坏。所以如果你想使用它,你应该重置上下文值。

    【讨论】:

    • 所以我为特定的位置编号设置了 glDisableVertexAttribArray(),但它仍然在着色器中读取为 {0,0,1,1}。我正在使用VAO,所以我只打了一次电话。我应该在调用 glDrawElements() 之前禁用它们吗?
    • @Pondwater:如果 VAO 禁用它,那么它就会被禁用。您不必再次禁用它。另外,我对答案做了一个附录。
    • 啊,有道理!谢谢你的澄清!
    【解决方案2】:

    它们在这里有点未定义,但这可能不是问题。 GL 状态由CURRENT_VERTEX_ATTRIB 值组成。最初,它们是 (0,0,0,1)。您可以通过glVertexAttrib() 系列函数显式设置未启用数组的那些属性的属性值。

    唯一需要担心的是在绘制过程中实际启用属性数组时当前值会发生什么。引用Spec (Version 3.3),第 2.8.3 节顶点数组 - 绘图命令:

    如果一个数组对应一个顶点着色器所需的通用属性 未启用,则对应元素取自当前泛型 属性状态(参见第 2.7 节)。

    如果顶点着色器所需的通用属性对应的数组是 启用后,对应的当前通用属性值未定义 执行DrawArraysOneInstance

    因此,您只需在为该特定属性启用数组进行绘制后指定一个有用的值。

    更新

    这种行为实际上已经从OpenGL 4.2开始改变了:

    如果顶点着色器所需的通用属性对应的数组是 未启用,则对应元素取自当前通用属性 状态(见第 2.7 节)。否则,如果启用了数组,则对应的 当前的通用属性值不受执行 DrawArraysOneInstance 的影响

    所以现在,glDraw*() 调用将永远不会修改当前设置的属性值。

    【讨论】:

    • "它们在这里有点未定义,但这可能不是问题。GL 状态由 CURRENT_VERTEX_ATTRIB 值组成。" 那么这如何使它们“有点像不明确的”?如果规范定义了它们,它就不是未定义的。
    • @NicolBolas:我指的是在启用属性数组(如规范)的情况下渲染后值未定义的事实,我假设 OP 正在这样做,否则他们会有如果他甚至不知道glVertexAttrib,就使用默认值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    相关资源
    最近更新 更多