OpenGL step by step - tutorial_5 "Uniform Variables"

本节我们又认识一个新的shader变量类型——uniform变量。attribute变量和uniform变量的区别:attribute变量存储的是每顶点特有的数据,调用shader时每次从顶点buffer载入一个新的值(毕竟每个顶点调用一次shader处理);然而uniform变量的内容在一个绘制过程中是不变的,就是说在绘制函数调用前写入这个值,然后在每次调用顶点shader是接收的都是这个值。uniform变量常用来存储光照参数(光源位置和方向等)、转换矩阵、纹理对象句柄等数据。‘

这节我们最终是要让屏幕上的图像动起来。我们使用一个每帧都在变化的uniform变量以及一个GLUT提供的空闲回调函数(idle callback function)。重点是,GLUT不会重复调用我们的渲染函数——除非强制它怎么做。GLUT只会在监听到一些事件后执行,例如窗口最大最小化或切换到其他窗口之上。如果在程序运行后我们不对窗口布局做任何操作,那绘制函数只会被调用一次。在绘制函数里加一个printf你就可以看到效果了。之前我们只在GLUT中注册了渲染函数这是没问题的,但是现在我们是想重复的改变一个变量的值。所以,我们注册了一个idle function。idle function会在窗口系统没有变化时执行。You can have a dedicated function for this callback where you will do any bookkeeping such as time update或者直接把绘制函数注册为idle callback。这里,我们使用后者方法。


glutIdleFunc(RenderSceneCB);

//这里,我们把绘制函数注册为idle function。Note that if you decide to use a dedicated idle callback function then you will need to add a call to glutPostRedisplay() at the end of it. Else the idle function will be called again and again but the render function will not. glutPostRedisplay() marks the current window as needed to be redisplayed and during the next round through GLUT's main loop the render callback will be called.


gScaleLocation = glGetUniformLocation(shaderProgram,'gScale');

assert(gScaleLocation!=0xFFFFFFFF);

//在链接了shader程序对象后,我们在程序对象中查找这个uniform变量的location值。这是一个案例的例子,应用程序的C/C++运行环境需要被映射到shader运行环境。你不能直接获取shader的内容也不能直接去修改他的值。当编译shader时,GLSL编译器会给shader中每个uniform变量分配一个索引。在编译器内部shader的uniform变量也是用这个索引访问的,对于应用程序就是使用glGetUniformLocation来获取该变量的索引并访问了。使用程序对象句柄和这个变量名称来调用该函数。查找成功就返回索引值,否则返回-1。所以检测返回值是很重要的(我们使用assert检测的),如果出错却没检测那新的更新值将不会被传入shader。有两种可能会造成出错:变量名拼写错误或该变量被编译器优化掉了。

static float Scale=0.0f;

Scale+=0.001f;

glUniform1f(gScaleLocation,sinf(Scale));

//定义一个静态浮点变量,变量值在每调用一次绘制函数时增加一点。使用sin值自然就会使传入值在[-1.0,1.0]区间了。glUniform1f()负责把值传入shader,当然这个函数也有多个版本glUniform{1234}{if}当然还有向量版本和矩阵版本。第一个参数就是用glGetUniformLocation返回的该变量在shader中的location索引。

下面就试着在顶点shader内使用一下吧。

uniform float gScale;

//在顶点shader中声明这个uniform变量。

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值