着色器语言之 uniform 限制符

585 阅读1分钟
原文链接: zhuanlan.zhihu.com

以上是opengl es3.2官方文档中对于 uniform限制符的描述,主要说了几点:

1在shader代码中,它必须申明为全局变量(global variable)。

2它的值在整个图元处理的过程中不会发生改变。

3它的值是只读的(read-only),可以通过api初始化也可以在链接期初始化。

4采样器(用于访问纹理)不需要初始化。

5它可以用来修饰任何基础类型,即使是结构体或各种类型的数组。

本质上说,uniform就是在应用程序和各个shader之间搭建了一个桥梁,让它们之间可以传递一个在各个shader内不可以修改值的变量。


首先在着色器中申明一个uniform修饰的变量

然后在链接期 生成一个uniform变量列表(variable’s initializer),如果需要设置着色器中gScale的值,必须先获取列表中的索引,通过glGetUniformLocation()函数获得。

ShaderProgram表示着色器程序,是通过函数直接创建的

gScale即变量名字

gScaleLocation就是gScale变量在当前uniform变量列表中的索引值(除非再次调用glLinkProgram()函数重新链接项目,否则这个索引值不会改变)。有了这个值之后,在程序中就可以通过

来给这个变量赋值。

函数说明

Reference:


  1. 函数说明http://blog.csdn.net/wangyuchun_799/article/details/7742787
  2. GLSL_ES_Specification_3.20.withchanges https://http://www.khronos.org/registry/gles/specs/3.2/GLSL_ES_Specification_3.20.withchanges.pdf
  3. http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html