C++ 如何将属性传递到GLSL中的顶点着色器?

C++ 如何将属性传递到GLSL中的顶点着色器?,c++,glsl,vertex-shader,C++,Glsl,Vertex Shader,我想将单个浮点或无符号int类型变量传递给顶点着色器,但只能将vec或struct作为属性变量传递。因此,我使用了一个vec2type属性变量,然后使用它来访问内容 glBindAttribLocation(program, 0, "Bid"); glEnableVertexAttribArray(0); glVertexAttribIPointer(0, 1, GL_UNSIGNED_INT, sizeof(strideStructure), (const GLvoid*)0)

我想将单个浮点或无符号int类型变量传递给顶点着色器,但只能将vec或struct作为属性变量传递。因此,我使用了一个
vec2
type属性变量,然后使用它来访问内容

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,那么向量属性中存储数据的顺序是什么?

您可以对属性使用标量类型。根据GLSL 1.50规范(对应于OpenGL 3.2):

顶点着色器输入只能是浮点、浮点向量、矩阵、有符号和无符号整数以及整数向量。顶点着色器输入也可以形成这些类型的数组,但不能形成结构

无论使用向量值还是标量值,类型都必须匹配。在您的示例中,您将
GL\u UNSIGNED\u INT
指定为属性类型,但着色器中的类型为
ivec2
,这是一个有符号值。它应该是
uvec2
,以匹配指定的属性类型

是,如果在着色器中将类型声明为
uvec2 Bid
,但只传递一个值,则该值将位于
Bid.x
中<代码>出价。y
将为0。如果每个顶点传递两个值,第一个值将位于
Bid.x
,第二个值位于
Bid.y

您听起来有点不清楚顶点着色器是如何调用的,特别是在谈到“循环运行”时。这里没有循环。顶点着色器将为每个顶点调用一次,该特定顶点的相应属性值将传递到属性变量中。对于每个顶点,它们将位于相同的属性变量中,并且位于这些变量中的相同位置

我想你可以想象一个“循环”,即为每个顶点调用顶点着色器。实际上,GPU上的许多处理将并行进行。这意味着将同时调用一组顶点的顶点着色器。每一个都有自己的变量实例,因此它们不会以相互之间的方式获取,并且每个实例的属性将以完全相同的方式传递

关于代码的附加说明。您需要小心打这个电话:

glBindAttribLocation(program, 0, "Bid");

链接着色器程序之前,需要调用
glBindAttribLocation()
。否则它将没有任何效果。

为什么不试试看呢?仍然使用旧的opengl=(非常感谢,我是认真的。另外,关于GLBindAttributeLocation,我实际上一直在做错事。谢谢你注意到这一点。