OpenGL 入门4

原帖地址:
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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值