【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享
一、在GLSL中使用Uniform Block
在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为:
方法一: