繁体   English   中英

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

[英]How are attributes passed to vertex shader in GLSL?

我想将单个float或unsigned int类型变量传递给顶点着色器,但是您只能将vec或struct作为属性变量传递。 所以,我使用了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-component中? 在循环的第二次运行中,传递的数据是否会存储在不同矢量属性的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() 否则它将无效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM