OpenGL 入门4

来源:互联网 发布:复制文件 linux 编辑:程序博客网 时间:2024/06/06 09:17

原帖地址:
http://ogldev.atspace.co.uk/www/tutorial05/tutorial05.html
http://blog.csdn.net/cordova/article/details/52504118

Uniform variables

Uniform variable和之前gl_Position等内置变量是略有不同的。每次有shader调用的时候,内置变量的数据是从顶点缓存中取得的,而uniform variable的数据一般是来自程序中的变量。uniform variable的作用很多,一般我们可以用它来存储光源位置,光源方向,变换矩阵或者贴图对象句柄等。

API

glutIdleFunc(RenderSceneCB);

之前设定的glutDisplayFunc()中的回调函数,也就是渲染图像的回调函数在opengl中并不会一直被调用。通常会在第一次创建完窗口之后调用一次,之后每改变窗口的大小、位置或者是发生窗口覆盖事件时会调用一次。为了实现动画,我们必须要让这个渲染回调不停的调用,这是就要使用上面的函数。以上函数的作用是在没有收到任何窗口消息时,不停的调用RenderSceneCB函数,我们可以把这个函数设置成glutDisplayFunc()中的渲染回调函数,那么窗口就会不停的绘制了。

gScaleLocation = glGetUniformLocation(ShaderProgram, "gScale");assert(gScaleLocation != 0xFFFFFFFF);

当我们在编译GLSL程序的时候,GLSL编译器会给每个uniform variable一个索引。我们可以使用glGetUniformLocation来获取到这个索引。如果没有获取到这个索引,那么返回值gScaleLocation就会是-1。造成返回值为-1的情况通常有两种,第一种情况是我们在shader中声明的那个uniform ariable没有被使用,那么GLSL编译器就会在优化的过程中把它丢掉,第二种情况是输入的uniform variable的名字错误,和shader中的名字不相同。

static float Scale = 0.0f;Scale += 0.001f;glUniform1f(gScaleLocation, sinf(Scale));

我们声明了一个float型的Scale,每一次draw call我们把他的值增加0.001,并且用glUniform1f函数将这个浮点数的余弦值传给gScaleLocation。这里glUniform1f中的1f代表传入的是一个浮点数。还有其他类似的后缀,比如:3i,3f,2i等等。

uniform float gScale;

在shader程序里,我们声明了一个uniform variable,叫做gScale。这个和glGetUniformLocation()中的名字是一样的。我们从c/c++传入的数据就存在gScale里面。

gl_Position = vec4(gScale * Position.x, gScale * Position.y, Position.z, 1.0);

我们将传入的gScale乘上顶点的x,y坐标,让所渲染图形的x,y坐标呈现周期行的变化。

0 0