首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

【OpenGL4.0】GLSL-施用Uniform Block实现着色器的数据共享

2012-07-22 
【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享一、在GLSL中使用Uniform Block在GLSL渲染语言中,

【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享

一、在GLSL中使用Uniform Block

在GLSL渲染语言中,我们经常采用缓冲区来存储Uniform型的Block。

比如我们需要绘制下面这样的效果:

【OpenGL4.0】GLSL-施用Uniform Block实现着色器的数据共享

在这里我们绘制了一个圆,圆内部颜色和外部颜色不同,而且边缘部分,颜色是平滑过渡的。

我们这样来实现这一效果:

首先定义一个内径和外径。然后给这个正方形分配纹理坐标,然后通过纹理坐标离(0.5,0.5)的距离与内径和外径的关系来控制当前像素点的颜色。


我们要在Shader中提供这样的一些信息:圆的内径及外径、内部颜色和外部颜色。采用Block来将这些信息封装在一起是合适的选择。

采用Block的原因是:

如果你的程序中包含了多个着色器,而且这些着色器使用了相同的Uniform变量,你就不得不为每个着色器分别管理这些变量。Uniform变量的location是在程序链接的时候产生的,因此Uniform变量的location会随着着色器的不同而发生变化。因此,这些Uniform变量的数据必须重新产生,然后应用到新的location上。

而Uniform Block正是为了使在着色器间共享Uniform数据变得更加容易而设计的。有了Uniform Block,我们可以创建一个缓冲区对象来存储这些Uniform变量的值,然后将缓冲区对象绑定到Uniform Block。当着色器程序改变的时候,只需要将同样的缓冲区对重新绑定到在新的着色器中与之相关的Block即可。


Uniform Block的定义和C/C++中的struct很类似。在本文的例子中我们需要定义的Uniform Block为:

方法一: