Ogl Step5 Uniform Variables
背景
在这一节中我们将会使用到一个新的着色器变量————一致变量。属性变量与一致变量的不同在于,属性变量是由顶点指定的并在每一次的着色器调用中都会去从顶点缓冲区中读取。然而一致变量是在整个绘制调用保持一致。这也就意味着你在绘制调用前赋了一个值,然后你在每一次调用顶点着色器的时候使用的都是同一个值。着色器有两种类型的参数:一致变量(Uniform variables)指得是在一帧当中保持恒定的数值,典型的参数包括视口的方向和灯光的方向。而易变变量(Varying variables)对于每一个执行单元(包括顶点着色器中的顶点,以及片元着色器中的片元)都是变化的。
在这一节中我们将会用一组一致变量在每一帧中都进行改变,通过GLUT提供的idle回调函数来实现。GLUT只有在窗体改变了尺寸和被其他窗体覆盖的时候会调用回调函数。如果在程序加载之后,我们什么都不做那么回调函数只会被调用一次。我们通过注册一个idle的回调函数来实现循环绘制画面,idle函数会在窗体系统没有接收到任何消息的时候被调用。
代码漫游
1
|
|
在这里我们注册一个idle函数。如果你想要使用一个有用的idle回调函数,你需要在它结束是添加一个glutPostRedisplay()函数。否则idle函数会被一直调用,但是渲染函数却不会。glutPostRedisplay()标志了当前窗体需要被重新显示,在下一个GLUT的main循环中绘制回调函数将会被调用。
1 2 |
|
在链接了程序之后,我们通过glGetUniformLocation方法去获得gScale一致变量的地址。这是一种C\C++程序执行环境映射到着色器的执行环境。你不能直接访问着色器里的内容也不能直接修改里面的变量。当你编译着色器是,GLSL的编译器就为每一个一致变量建立了一个索引。着色器器内部是通过这个索引对变量进行操作。我们也可以通过glGetUniformLocation获得某个程序内部的变量名的索引。这个函数返回索引,出错时返回-1。检查错误非常重要,着色器内部不存在这个变量(你的变量名拼写错误)或者编译器对这个变量进行了优化(为被使用的变量)都会导致glGetUniformLocation调用失败。
1 2 3 |
|
使用一个静态变量Scale,在每次渲染调用是递增。传给着色器的值是Scale的正弦值。会产生一个在-1.0到1.0之间的值。 通过glUniform1f传给着色器。OpenGl提供了多种形式glUniform{1234}{if}。glUniform2i glUniform3f…etc. glUniform传的第一个参数是索引。
我们只对上一教程的VS段进行修改,FS保持不变
1
|
|
定义一个一致变量。
1
|
|
我们队X和Y的值进行转换。你知道为什么三角形会在循环到一半时倒过来吗?