Improved particle system - dynamic compile SHADER
Dynamically determine the FX code that needs to be compiled
Ask a few friends, and finally decide to solve this problem with macro definitions supported by FX.
Depending on the transmitter and the effect of the particles and the effect definition, in the FX file, by judging whether the corresponding macro is defined (# ifdef ... # ENDIF) to determine whether to compile a certain piece of code.
The FX code is as follows:
Struct vs_INPUT
{
FLOAT3 POSITION: POSITION;
FLOAT2 TEX0: TEXCOORD0;
FLOAT3 TEX1: Texcoord1; // Upoffset, Leftoffset, TotalTimetolife
FLOAT3 TEX2: TEXCOORD2; // Velocity
FLOAT3 TEX3: TEXCOORD3; // Rotation
Float3 StartDiffuse: Color0;
}
Struct vs_output
{
FLOAT4 POSITION: Position;
FLOAT3 DIFFUSE: Color0;
FLOAT2 TEX0: TEXCOORD0;
FLOAT2 TEX1: Texcoord1;
}
Matrix matworldviewproj; // world-view-proj matrix
Float4 RightVector; // Right Vector
FLOAT4 UpVector; // Up Vector
FLOAT4 TIME_COLOUR; // Elasped Time, Delta Colour
Float4 acceleration;
Float finitparticlewidth;
Float finitparticleheight;
// Texture TexturePArticle;
Sampler Particlesampler = Sampler_State
{
// texture = (TexturePArticle);
Addressu = WRAP;
Addressv = Wrap;
Addressw = Wrap;
Minfilter = linear;
MAGFILTER = linear;
MIPFILTER = linear;
}
#ifdef AnimationTexture
IANIMTEXSIDELENGTH;
INT IANIMTEXNUMFRAME;
Float fanimtexduration;
#ENDIF
#ifdef v3dscaleAffector
Float fscalepersecond;
#ENDIF
#ifdef v3dcolourimageAffector
Texture TextureColour;
Sampler coloursampler = Sampler_State
{
Texture = (TextURECOLOUR);
Minfilter = POINT;
Magfilter = POINT;
MIPFILTER = POINT;
}
#ENDIF
Vs_output vs (const vs_input input)
{
Vs_output out = (vs_output) 0;
// live time = fmod (Elapsed Time, TotalTimetolife)
Float flivetime = fmod (time_colour.x, input.tex1.z);
Float fparticlewidth = finitparticlewidth;
Float fpArticleheight = FinitPArticleHeight;
#ifdef v3dscaleAffector
FLOAT FDELTASCALE = fscalepersecond * flivetime;
FPArticleWidth = fdeltascale;
FPArticleheight = fdeltascale;
IF (FPArticleWidth <0.F || fpArticleHeight <0.F)
FPArticleWidth = fparticleheight = 0.f;
#ENDIF
// Position = Right Up POS;
FLOAT4 Right = RightVector * Input.tex1.x * fparticlewidth;
FLOAT4 UP = UpVector * Input.tex1.y * fparticleheight;
Float4 POS = float4 (Input.position, 0) Right Up;
// position = POS VT 1/2 * V * T * T
Float4 deltavel = mul (float4 (input.tex2,0), flivetime);
#ifdef v3dlinearforceaffector
Deltavel = deltavel acceleration * flivetime * flivetime;
#ENDIF
POS = POS Deltavel;
POS.W = 1.0;
Out.position = MUL (POS, MATWORLDVIEWPROJ);
// color
Out.diffuse = INPUT.StartDiffuse;
#ifdef v3dcolourfaderaffector
Out.diffuse.x = input.startdiffuse.x Time_COLOUR.Y * flivetime;
Out.diffuse.y = input.startdiffuse.y time_colour.z * flivetime;
Out.diffuse.z = input.startdiffuse.z Time_COLOUR.W * flivetime
#ENDIF
// texcoord
Out.tex0 = input.tex0;
#ifdef AnimationTexture
FLOAT FANIMTEXLIVETIME = FMOD (Flivetime, Fanimtexduration);
INT IANIMTEXCURRFRAME = (fanimtexlivetime / fanimtexduration) * ianimtexnumframe
INT icurrx = IANIMTEXCURRFRAME% IANIMTEXSIDELENGTH;
Int icrry = IANIMTEXCURRFRAME / IANIMTEXSIDELENGTH; float2 fanimtexcorrdxy;
IF (Input.Tex1.x <0.f)
{
FANIMTEXCORRDXY.X = (iCurRX) / (FLOAT) (IANIMTEXSIDELENGTH);
}
Else IF (Input.Tex1.x> 0.F)
{
FANIMTEXCORRDXY.X = (FLOAT) (IcURRX 1) / (FLOAT) (IANIMTEXSIDELENGTH);
}
IF (Input.Tex1.y <0.f)
{
FanimTexcorrdxy.y = (float) (ianimtexsideLength) (IANIMTEXSIDELENGTH);
}
Else IF (Input.Tex1.x> 0.F)
{
Fanimtexcorrdxy.y = (iCurry) / (float) (IANIMTEXSIDELENGTH);
}
Out.tex0 = fanimtexcorrdxy;
#ENDIF
#ifdef v3dcolourimageAffector
Out.tex1 = float2 (flivetime, 0.f);
#ENDIF
#ifdef v3drotationAffector
Float frottexdatabase [8] = {
-0.5, 0.5,
0.5, 0.5,
-0.5, -0.5,
0.5, -0.5};
FLOAT frotation = input.tex3.x flivetime * input.tex3.y;
Float fsinrot, fcosrot;
Sincos (FROTATION, FSINROT, FCOSROT);
Float2 frottexcorrdxy;
INT IROTTEXBASEIDX = INPUT.TEX3.Z * 2;
Frottexcorrdxy.x = (fcosrot * frottexdatabase [irottexbaseidx]) (fsinrot * frottexdatabase [ottexbaseidx 1]) 0.5;
Frottexcorrdxy.y = (fsinrot * frottexdatabase) - (fcosrot * frottexdatabase [rttexbaseidx 1]) 0.5;
Out.tex0 = frottexcorrdxy;
#ENDIF
Return Out;
}
FLOAT4 PS_1_1 (vs_output in): Color0
{
FLOAT4 FINALCOLOUR = float4 (in.diffuse, 0.f);
#ifdef v3dcolourimageAffector
FinalColour * = TEX2D (Coloursampler, In.Tex1);
#ENDIF
FinalCOLOUR * = TEX2D (Particlesampler, In.Tex0);
FinalColour.w = 1.f;
Return FinalColour;
}
Technique TEC0
{
Pass P0
{
VertexShader = compile vs_1_1 vs ();
#ifdef v3dcolourimageAffector
Pixelshader = compile ps_1_1 ps_1_1 (); // NULL;
#ELSE
Pixelshader = NULL; #ENDIF
}
}
Support for transmitters and effects
Properties supported by Shader renderer
1, default height
2, default width
3, maximum number of particles
Here represents the number of particles existing at the same time
4, particle head
5, way to face the camera
6, particle UP vector
7. Is it a 2D particle system?
Support all transmitters
8, support transmitter unique properties (such as the inner ring size of the ring transmitter, outer ring size)
9, angle
10, start color
11, end color
12, direction
13, minimum survival
14, maximum survival
15, minimum speed
16, maximum speed
17, position
Supported effects and properties
18, color attenuation
19, linear external force: "external force" refers to acceleration A, meets the formula S = VT 1/2 * a * t * t, the force pattern does not work
20, rotation
21, zoom
22, color attenuation map
Do not support state-independent effects:
1, collision body
2, random speed
3, various power fields (straight line, point force field)
Project change
1. Optimize the GPU to optimize or require the use of GPU enhancements, art editing uses the "Shader Renderer" version.
2. The name rule for the SHADER renderer is to add "_shader" after the file name of the original Billboard renderer, and the program distinguishes different versions via the file name.
3, when loading particles in the game
IF ((with GPU Realization Version) && (graphics card supports VS, PS version))
Load GPU implementation version
Else
Load CPU implementation version
Screenshot
1, rotation
2, zoom, you can see that most of the graphics card operations
3, texture animation
Todo
1. Some different problems in solving particles using GPU processing and CPU processing
Author: fannyfish
BLOG: http://blog.9cbs.net/fannyfish
Amma@zsws.org