如何在 GLSL 中将属性传递给顶点着色器
How are attributes passed to vertex shader in GLSL?
我想将单个浮点数或无符号 int 类型变量传递给顶点着色器,但您只能将 vec 或结构作为属性变量传递。因此,我使用了 vec2
类型的属性变量,后来使用它来访问内容。
glBindAttribLocation(program, 0, "Bid");
glEnableVertexAttribArray(0);
glVertexAttribIPointer(0, 1, GL_UNSIGNED_INT, sizeof(strideStructure), (const GLvoid*)0);
顶点着色器包含以下代码:
attribute ivec2 Bid;
void main()
{
int x = Bid.x;
int y = Bid.y;
}
那么,当我每次传递值时,值不会存储在vec2 Bid
的 x 分量中吗?在循环的第二次运行中,传递的数据是否会存储在不同向量属性的 x- 分量中?另外,例如,如果我将 size 参数更改为 2,则数据在 vector 属性中的存储顺序是什么?
您可以对属性使用标量类型。来自 GLSL 1.50 规范(对应于 OpenGL 3.2):
顶点着色器输入只能是浮点数、浮点向量、矩阵、有符号和无符号整数以及整数向量。顶点着色器输入也可以形成这些类型的数组,但不能形成结构。
无论使用矢量值还是标量值,类型都必须匹配。在您的示例中,您将GL_UNSIGNED_INT
指定为属性类型,但着色器中的类型是 ivec2
,这是一个有符号值。应uvec2
它以匹配指定的属性类型。
是的,如果将着色器中的类型声明为 uvec2 Bid
,但只传递一个值,则该值将位于 Bid.x
中。 Bid.y
将为 0。如果为每个顶点传递两个值,则第一个值将以Bid.x
为单位,第二个值将以Bid.y
为单位。
你听起来有点不清楚顶点着色器是如何调用的,特别是当你谈论"循环运行"时。这里没有循环。每个顶点调用一次顶点着色器,并将在属性变量中传递此特定顶点的相应属性值。对于每个折点,它们将位于相同的属性变量中,并且位于这些变量中的同一位置。
我想你可以想象一个"循环",即为每个顶点调用顶点着色器。实际上,GPU 上的大量处理将并行进行。这意味着将同时调用一组顶点的顶点着色器。每个实例都有自己的变量实例,因此它们不会相互妨碍,并且每个实例的属性将以完全相同的方式传递。
有关代码的附加说明。您需要小心此调用:
glBindAttribLocation(program, 0, "Bid");
在链接着色器程序之前需要调用glBindAttribLocation()
。否则将没有效果。
- 我对 MyGraph 属性顶点名称和边权重有问题
- BGL:无法访问捆绑的顶点属性
- 输出(用于 GraphViz)提升图顶点及其属性,使用具有私有变量的类作为捆绑属性
- 我可以将单个顶点索引与具有所有属性(位置、法线、texCoord)的顶点缓冲区一起使用吗?
- 可以在同一 VBO 中存储不同的顶点属性和索引
- Boost:列出GraphMl中指定的顶点和边缘属性
- 如何使用boost::graph dijkstra的算法,如果顶点属性是指针?
- BGL Adjacency_list:如何使用顶点属性(而不是描述符)对OUT_EDGE进行排序
- 在 OpenGL 中,为什么除非我再次重新指定顶点属性,否则我的缓冲区对象不会绘制?
- 打开"GL着色器存储缓冲区对象"以替换"顶点属性"
- 如何在 GLSL 中使用 4x4 矩阵作为顶点属性
- 顶点属性 - 对顶点位置使用短点而不是浮点数
- OpenGL顶点属性指针或着色器不工作
- 顶点属性大小不匹配时会发生什么情况
- C++ 提升图形库:输出自定义顶点属性
- 获取Boost::图的顶点属性
- 发送规范化顶点属性会产生垃圾
- Opengl ES 2.0的顶点属性为ivec4
- 当不使用某些顶点属性时,glDrawElements崩溃
- 自定义顶点属性