OpenGL实例教程05:uniform变量
什么是uniform变量?
uniform变量是shader中使用的一种变量类型。用于应用程序将数据传送给着色器。
属性变量和uniform变量有什么区别?
属性变量包含的数据专用于某一个顶点,每一次着色器调用都会从顶点缓冲区中加载一个新的值,而uniform变量在一次绘制过程中是常量,不可以被修改。
属性变量存储的是按顶点变化的值。例如:顶点坐标,顶点颜色,顶点法线值等等。
uniform变量适合用于存储按帧变化,或不变化的值。例如:光照参数(光照位置和方向等)、变换矩阵等等。
uniform变量于动画
uniform变量的值是按帧变化的。因此,可以用于动画效果制作。例如,我们可以对顶点着色器的所有顶点都乘以一个缩放值,而该缩放值为uniform变量,这样就可以在OpenGL应用程序中按动画的需要设置这个值。可以写一个大循环,或是定时器程序,或是利用其他技术手段改变uniform变量并要求显卡重新绘制。
shader代码
每一个顶点会执行一次顶点着色器,但在单次绘制过程中uniform变量保持不变:
应用程序代码
通过改变Scale变量的值改变三角形的顶点位置,通过sinf的使用确保值在-1到+1之间变化。为了产生动画,我们在回调函数中加入了一条语句:glutPostRedisplay();
因为目前我们的回调函数只在窗口发生变化时被执行,因此需要通过该语句发送一个重新绘制的请求。当然也可以采用循环,或定时器的方式产生动画。
