GLSL 变量属性

Posted nanqiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GLSL 变量属性相关的知识,希望对你有一定的参考价值。

1. attribute变量
为这个attribute变量指定一个位置(用无符号值表示):glBindAttribLocation
利用这个“位置”来指定需要传给shader里的attribue变量的数据:glVertexAttribPointer

2.uniform变量

Uniform是一种从CPU中的应用向GPU中的着色器发送数据的方式,但uniform和顶点属性有些不同。首先,uniform是全局的(Global)。全局意味着uniform变量必须在每个着色器程序对象中都是独一无二的,而且它可以被着色器程序的任意着色器在任意阶段访问。第二,无论你把uniform值设置成什么,uniform会一直保存它们的数据,直到它们被重置或更新。

我们通常在shaderProgram链接后获取一个uniform变量的位置,然后向这个位置传送数据(glGetUniformLocation/glUniform)。但是要特别注意的一点是:我们只有在启用了一个shaderProgram后,才能做这样的事情

如果你声明了一个uniform却在GLSL代码中没用过,编译器会静默移除这个变量,导致最后编译出的版本中并不会包含它,这可能导致几个非常麻烦的错误

注意,查询uniform地址不要求你之前使用过着色器程序,但是更新一个unform之前你必须先使用程序(调用glUseProgram),因为它是在当前激活的着色器程序中设置unform的。

3.varying变量
这个就是shader之间传递的变量类型了。传值时类型、名称相同

当类型和名字都一样的时候,OpenGL就会把两个变量链接到一起,它们之间就能发送数据了(这是在链接程序对象时完成的)。




以上是关于GLSL 变量属性的主要内容,如果未能解决你的问题,请参考以下文章

将 uint 属性传递给 GLSL

如何在 GLSL 中使用 4x4 矩阵作为顶点属性?

无法获取在GLSL 1.5中工作的整数顶点属性

GLSL 每个顶点固定大小的数组

GLSL中几个修饰符的简单讲解

在 GLSL 着色器中访问 VBO/VAO 数据