粒子系统是三维计算机图形学中用来模拟火,爆炸,雾,雪,流行尾迹或者发光轨迹等视觉效果的技术。粒子系统模拟这些现象的步奏简单的分为以下两步:
1. 更新每个粒子的属性,如粒子的颜色、速度,位置等。
2. 渲染粒子。采用billboard和纹理渲染粒子对象。
粒子系统负责管理粒子的个数和属性,当粒子结束生命周期时,如粒子的位置变换到特定的位置后,粒子系统负责将粒子设置为初始状态并开始新的旅程。但粒子系统有如下两个问题:
1. 粒子系统是在CPU中更新粒子的状态。每次更新状态后都需要将数据从cpu端拷贝到GPU端,假设粒子状态每帧都更新,那么数据的传递将对渲染的效率产生很大的影响。
2. 粒子系统中对粒子状态的更新都是用的同一个方法,GPU正好适合处理这样的运算。
我们可以只往GPU中传递一次粒子的初始属性,然后在GPU中维护粒子的属性并进行渲染。过程如下:
1. 使用两个shaderprogram,其中一个shader负责更新粒子的属性,另一个shader负责渲染渲染。
2. 利用变换反馈(transform feedback)将两组顶点缓冲区轮流作为渲染用的顶点数据,和保存更新后的顶点数据。变换反馈位于几何图形着色器和顶点装配阶段之间。因为几何着色器是可选的,如果不使用几何着色器,这些数据实际上是来自顶点着色器。变换反馈允许将一个顶点找色器或者几何着色器的结果保存到一个缓冲区中,这个缓冲区中保存的更新后的数据作为下一步的渲染使用。OPenGL中使用变化反馈的示例如下:
const char *tf_varying[]= { "out_position","out_color"}; glTransformFeedbackVaryings(update_program,2,tf_varying,GL_SEPARATE_ATTRIBS);
这两句话指明负责更新粒子状态的shader中的输出变量"out_position"和"out_color"将被被保存到变换反馈缓冲区中,需要在shader链接之前指定。然而变换反馈并没有真正的缓冲区,它只是一个绑定点,需要将真正的缓冲区绑定到该绑定点:
glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER,0,render_positionBuffer);