粒子系统作为在游戏中一个挺常见的技术,用在各种爆炸,下雨,火焰等特效中。我们利用GPU中的GeomtryShader来实现一个粒子系统。以下雨特效为例。
介绍粒子系统具体实现前先介绍下GeomtryShader的StreamOutput这个特性。StreamOutput这个Stage把GeometryShader的计算结果输出到一个buffer中。
下面主要从Shader代码设计的角度讲下如何实现一个下雨特效的粒子系统,其核心算法说白了就一句话:分成主粒子和副粒子。主粒子按时间间隔分裂副粒子,副粒子到了一定的时间就死亡。
绘制时要么用公告板绘制一个粒子,要么用一条直线绘制一个粒子。
只是具体的shader代码的设计要花点心思,在其在shader内部经过了两个technique,一个主要利用Geometry Shader的StreamOuput输出到一段buffer中;另一个利用上面的计算结果来进行绘制,具体的粒子运动情况(受重力)的更新等可以放在第二个technique的geometry shader里面。
第一个technique,也就是负责利用Geometry来计算,并通过StreamOutput输出到一个buffer中的technique,为了整体清晰我先把technique写出来:
technique11 StreamOutTech
{
pass P0
{
SetVertexShader(CompileShader(vs_4_0,StreamOut_VS()));
SetGeometryShader( ConstructGSWithSO( CompileShader(gs_4_0,StreamOut_GS()),"POSITION.xyz;VELOCITY.xyz;SIZE.xy;AGE.x;TYPE.x" ) );
SetPixelShader(NULL);
SetDepthStencilState(DisableDepth,0);
}
}
//================================================
//StreamOutTech
//================================================
Particle StreamOut_VS(Particle vIn)
{
return vIn;
}
[maxvertexcount(6)]
void StreamOut_GS(point Particle gIn[1],inout PointStream<Particle> pStream)
{