使用布局限定符时未缓冲顶点属性的 OpenGL 默认值

标签 opengl attributes shader vertex-buffer

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

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

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} 是否安全?或者这只是一个巧合?

最佳答案

Can I expect the value to be anything particular?



是的,这是一个特殊的值。

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

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

关于使用布局限定符时未缓冲顶点属性的 OpenGL 默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17819034/

相关文章:

NHibernate Fluent 与属性

glsl - 如何确定性地检测着色器片段在其 2x2 像素四边形中的位置?

javascript - Openlayers 访问低级 WebGL 着色器

c++ - openGL 着色器 : two object and one line to connect them

c++ - 防止 overdraw 的技术(OpenGL)

xslt - XPath 有序优先属性搜索

javascript - 当使用 jQuery 选择元素时,如何获取元素的普通属性?

shader - HLSL 像素着色器 - 更改特定色调的图像颜色

c++ - 文本渲染非常慢

c++ - 使用 OpenGL 在 Qt 项目中设置错误