- Timestamp:
- Nov 9, 2018, 1:06:05 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
data/branches/Shader_HS18/programs/Example/GLSL150/ParticleGS_GenerateGS.glsl
r12083 r12091 2 2 3 3 // 4 // Explanation of different particle types 5 // 6 #define PT_LAUNCHER 0 //Firework Launcher - launches a PT_SHELL every so many seconds 7 #define PT_SHELL 1 //Unexploded shell - flies from the origin and explodes into many PT_EMBERXs 8 #define PT_EMBER1 2 //basic particle - after it's emitted from the shell, it dies 9 #define PT_EMBER2 3 //after it's emitted, it explodes again into many PT_EMBER1s 10 #define PT_EMBER3 4 //just a differently colored ember1 4 // Explanation of different particle types. 5 // 6 // Firework Launcher - launches a PT_SHELL every so many seconds. 7 #define PT_LAUNCHER 0 8 // Unexploded shell - flies from the origin and explodes into many PT_EMBERX's. 9 #define PT_SHELL 1 10 // Basic particle - after it's emitted from the shell, it dies. 11 #define PT_EMBER1 2 12 // After it's emitted, it explodes again into many PT_EMBER1's. 13 #define PT_EMBER2 3 14 // Just a different colored ember1. 15 #define PT_EMBER3 4 11 16 #define P_SHELLLIFE 3.0 12 17 #define P_EMBER1LIFE 2.5 … … 14 19 #define P_EMBER3LIFE 2.0 15 20 16 // These two were originally shader params, but they caused runtime errors21 // These two were originally shader params, but they caused runtime errors. 17 22 #define NUM_EMBER_1S 30 18 23 #define NUM_EMBER_2S 15 19 24 #define NUM_EMBER_3S 10 20 // This one was originally a variant, but this also causes runtime errors25 // This one was originally a variant, but also causes runtime errors. 21 26 //#define MAX_EMBER_2S 15.0 22 27 28 layout(points) in; 29 layout(points, max_vertices = 60) out; 30 23 31 in block { 24 vec4Pos;25 floatTimer;26 float 27 vec3Vel;32 vec3 Pos; 33 float Timer; 34 float Type; 35 vec3 Vel; 28 36 } FireworkData[]; 29 37 30 layout(points) in; 31 layout(points, max_vertices = 1) out; 32 33 uniform sampler1D randomTex; 38 // out vec3 outputPos; 39 // out float outputTimer; 40 // out float outputType; 41 // out vec3 outputVel; 42 43 // out vec3 gl_Position; 44 out vec3 oPos; 45 out float oUv0; // Timer 46 out float oUv1; // Type 47 out vec3 oUv2; // Velocity 48 49 uniform sampler1D randomTexture; 34 50 uniform vec3 frameGravity; 35 51 uniform float globalTime; 36 52 uniform float elapsedTime; 37 53 uniform float secondsPerFirework; 38 out vec4 colour; 54 39 55 // 40 56 // Generic particle motion handler 41 57 // 42 43 58 void GSGenericHandler( vec3 Pos, vec3 Vel, float Timer, float Type, 44 float elapsedTime, 45 vec3 frameGravity) 46 { 47 gl_Position.xyz = Pos + (Vel * elapsedTime); 59 float elapsedTime, 60 vec3 frameGravity) 61 { 48 62 Vel += frameGravity; 49 63 Timer -= elapsedTime; 50 if (Pos.y > -100) 51 { 52 EmitVertex();//Pos : POSITION, Vel : TEXCOORD2, Timer : TEXCOORD0, Type : TEXCOORD1); 53 } 64 65 if (Pos.y > -100) 66 { 67 oPos = Pos + (Vel * elapsedTime); 68 oUv0 = Timer; 69 oUv1 = Type; 70 oUv2 = Vel; 71 EmitVertex(); 72 } 54 73 } 55 74 … … 66 85 // Launcher type particle handler 67 86 // 68 void GSLauncherHandler( vec3 Pos, vec3 Vel, float Timer, float Type, 69 float elapsedTime, 70 float globalTime, 71 72 73 { 74 if (Timer <= 0)75 { 76 vec3 vRandom = normalize( RandomDir( Type, globalTime, randomTex));77 //Give it more of an up bias 78 vRandom = normalize(vRandom + vec3(0, 2.5,0));79 80 //time to emit a new SHELL 81 gl_Position.xyz = Pos + Vel*elapsedTime;82 vec3 outputVel = Vel + vRandom*35.0;83 float outputTimer = P_SHELLLIFE + vRandom.y*0.5;84 float outputType= PT_SHELL;85 EmitVertex(); //(outputPos : POSITION, outputVel : TEXCOORD2, outputTimer : TEXCOORD0, outputType : TEXCOORD1);86 87 // reset our timer88 Timer = secondsPerFirework + vRandom.x *0.4;87 void GSLauncherHandler( vec3 Pos, vec3 Vel, float Timer, float Type, 88 float elapsedTime, 89 float globalTime, 90 sampler1D randomTex, 91 float secondsPerFirework) 92 { 93 if (Timer <= 0) 94 { 95 vec3 vRandom = normalize(RandomDir(Type, globalTime, randomTex)); 96 // Give it more of an up bias. 97 vRandom = normalize(vRandom + vec3(0, 2.5, 0)); 98 99 // Time to emit a new SHELL. 100 oPos = Pos + Vel * elapsedTime; 101 oUv2 = Vel + vRandom * 35.0; 102 oUv0 = P_SHELLLIFE + vRandom.y * 0.5; 103 oUv1 = PT_SHELL; 104 EmitVertex(); 105 106 // Reset our timer. 107 Timer = secondsPerFirework + vRandom.x * 0.4; 89 108 } 90 109 else … … 92 111 Timer -= elapsedTime; 93 112 } 94 95 //emit ourselves to keep us alive 96 EmitVertex();//( Pos : POSITION, Vel : TEXCOORD2, Timer : TEXCOORD0, Type : TEXCOORD1); 113 114 // Emit ourselves to keep us alive. 115 oPos = Pos; 116 oUv2 = Vel; 117 oUv0 = Timer; 118 oUv1 = Type; 119 EmitVertex(); 97 120 } 98 121 99 122 // 100 123 // Shell type particle handler 101 // 124 // 102 125 void GSShellHandler( vec3 Pos, vec3 Vel, float Timer, float Type, 103 float elapsedTime, 104 float globalTime, 105 sampler1D randomTex, 106 vec3 frameGravity) 107 { 108 if(Timer <= 0) 109 { 110 vec3 outputPos; 111 vec3 outputVel; 112 float outputTimer; 113 float outputType; 114 126 float elapsedTime, 127 float globalTime, 128 sampler1D randomTex, 129 vec3 frameGravity) 130 { 131 if (Timer <= 0) 132 { 115 133 vec3 vRandom = vec3(0,0,0); 116 117 // time to emit a series of new Ember1s118 for (int i=0; i<NUM_EMBER_1S; i++)134 135 // Time to emit a series of new Ember1s. 136 for (int i = 0; i < NUM_EMBER_1S; i++) 119 137 { 120 vRandom = normalize( RandomDir( Type+i, globalTime, randomTex ) ); 121 gl_Position.xyz = Pos + Vel*elapsedTime; 122 outputVel = Vel + vRandom*15.0; 123 outputTimer = P_EMBER1LIFE; 124 outputType = PT_EMBER1; 125 EmitVertex();//(outputPos : POSITION, outputTimer : TEXCOORD0, outputType : TEXCOORD1, outputVel : TEXCOORD2); 126 } 127 128 //find out how many Ember2s to emit 129 //Not doing this because it causes a runtime error 130 //int numEmber2s = abs(vRandom.x)*MAX_EMBER_2S; 131 for(int i=0; i<NUM_EMBER_2S; i++) 132 { 133 vRandom = normalize( RandomDir( Type, globalTime, randomTex) ); 134 gl_Position.xyz = Pos + Vel*elapsedTime; 135 outputVel = Vel + vRandom*10.0; 136 outputTimer = P_EMBER2LIFE + 0.4*vRandom.x; 137 outputType = PT_EMBER2; 138 EmitVertex();//(outputPos : POSITION, outputVel : TEXCOORD2, outputTimer : TEXCOORD0, outputType : TEXCOORD1); 139 } 140 141 } 142 else 143 { 144 GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity ); 145 } 146 } 147 148 // 149 // Ember1 and Ember3 type particle handler 150 // 151 void GSEmber1Handler( vec3 Pos, vec3 Vel, float Timer, float Type, 152 float elapsedTime, 153 vec3 frameGravity) 154 { 155 if(Timer > 0) 156 { 157 GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity ); 158 } 159 } 160 161 // 162 // Ember2 type particle handler 163 // 164 void GSEmber2Handler( vec3 Pos, vec3 Vel, float Timer, float Type, 165 float elapsedTime, 166 float globalTime, 167 sampler1D randomTex, 168 vec3 frameGravity) 169 { 170 if(Timer <= 0) 171 { 172 vec3 outputPos; 173 vec3 outputVel; 174 float outputTimer; 175 float outputType; 176 177 //time to emit a series of new Ember3s 178 for(int i=0; i<NUM_EMBER_3S; i++) 179 { 180 gl_Position.xyz = Pos + Vel*elapsedTime; 181 outputVel = Vel + normalize( RandomDir( Type + i, globalTime, randomTex ) )*10.0; 182 outputTimer = P_EMBER3LIFE; 183 outputType = PT_EMBER3; 138 vRandom = normalize(RandomDir(Type + i, globalTime, randomTex)); 139 oPos = Pos + Vel * elapsedTime; 140 oUv2 = Vel + vRandom * 15.0; 141 oUv0 = P_EMBER1LIFE; 142 oUv1 = PT_EMBER1; 184 143 EmitVertex(); 185 144 } 145 146 // Find out how many Ember2s to emit. 147 // Not doing this because it causes a runtime error. 148 //int numEmber2s = abs(vRandom.x)*MAX_EMBER_2S; 149 for (int i = 0; i < NUM_EMBER_2S; i++) 150 { 151 vRandom = normalize(RandomDir(Type, globalTime, randomTex)); 152 oPos = Pos + Vel * elapsedTime; 153 oUv2 = Vel + vRandom * 10.0; 154 oUv0 = P_EMBER2LIFE + 0.4 * vRandom.x; 155 oUv1 = PT_EMBER2; 156 EmitVertex(); 157 } 158 186 159 } 187 160 else 188 161 { 189 GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity ); 162 GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity); 163 } 164 } 165 166 // 167 // Ember1 and Ember3 type particle handler. 168 // 169 void GSEmber1Handler( vec3 Pos, vec3 Vel, float Timer, float Type, 170 float elapsedTime, 171 vec3 frameGravity) 172 { 173 if (Timer > 0) 174 { 175 GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity); 176 } 177 } 178 179 // 180 // Ember2 type particle handler. 181 // 182 void GSEmber2Handler( vec3 Pos, vec3 Vel, float Timer, float Type, 183 float elapsedTime, 184 float globalTime, 185 sampler1D randomTex, 186 vec3 frameGravity) 187 { 188 if (Timer <= 0) 189 { 190 // Time to emit a series of new Ember3's. 191 for (int i = 0; i < NUM_EMBER_3S; i++) 192 { 193 oPos = Pos + Vel * elapsedTime; 194 oUv2 = Vel + normalize(RandomDir(Type + i, globalTime, randomTex)) * 10.0; 195 oUv0 = P_EMBER3LIFE; 196 oUv1 = PT_EMBER3; 197 EmitVertex(); 198 } 199 } 200 else 201 { 202 GSGenericHandler(Pos, Vel, Timer, Type, elapsedTime, frameGravity); 190 203 } 191 204 } … … 193 206 void main() 194 207 { 195 if( FireworkData[0].Type == PT_LAUNCHER ) 196 GSLauncherHandler( FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type, 197 elapsedTime, globalTime, randomTex, secondsPerFirework); 198 else if ( FireworkData[0].Type == PT_SHELL ) 199 GSShellHandler( FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type, 200 elapsedTime, globalTime, randomTex, frameGravity); 201 else if ( FireworkData[0].Type == PT_EMBER1 || 202 FireworkData[0].Type == PT_EMBER3 ) 203 GSEmber1Handler( FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type, 204 elapsedTime, frameGravity); 205 else if( FireworkData[0].Type == PT_EMBER2 ) 206 GSEmber2Handler( FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type, 207 elapsedTime, globalTime, randomTex, frameGravity); 208 colour = vec4(1.0,1.0,0.0,1.0); 209 EndPrimitive(); 210 } 208 if (FireworkData[0].Type == PT_LAUNCHER) 209 GSLauncherHandler(FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type, 210 elapsedTime, globalTime, randomTexture, secondsPerFirework); 211 else if (FireworkData[0].Type == PT_SHELL) 212 GSShellHandler(FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type, 213 elapsedTime, globalTime, randomTexture, frameGravity); 214 else if (FireworkData[0].Type == PT_EMBER1 || 215 FireworkData[0].Type == PT_EMBER3) 216 GSEmber1Handler(FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type, 217 elapsedTime, frameGravity); 218 else if (FireworkData[0].Type == PT_EMBER2) 219 GSEmber2Handler(FireworkData[0].Pos.xyz, FireworkData[0].Vel, FireworkData[0].Timer, FireworkData[0].Type, 220 elapsedTime, globalTime, randomTexture, frameGravity); 221 EndPrimitive(); 222 223 // // gl_Position.xyz = FireworkData[0].Pos;// + FireworkData[0].Vel * elapsedTime; 224 // // gl_Position.w = 1; 225 // gl_Position = FireworkData[0].Pos + 1;// + FireworkData[0].Vel * elapsedTime; 226 // // gl_Position = Pos[0];// + FireworkData[0].Vel * elapsedTime; 227 // //gl_Position = vec4(10, 10, 10, 1); 228 // // oUv0 = P_SHELLLIFE + 0.5; 229 // oUv0 = FireworkData[0].Timer; 230 // // oUv0 = Timer[0]; 231 // oUv1 = FireworkData[0].Type; 232 // // oUv1 = Type[0]; 233 // oUv2 = FireworkData[0].Vel; 234 // // oUv2 = Vel[0]; 235 // //oUv2 = vec3(4, 5, 35.0); 236 // EmitVertex(); 237 // EndPrimitive(); 238 // // // gl_Position = vec4(10, 20, 30, 1); 239 // gl_Position = vec3(10, 20, 30); 240 // oUv0 = P_EMBER3LIFE; 241 // oUv1 = PT_SHELL; 242 // oUv2 = vec3(40, 50, 60); 243 // EmitVertex(); 244 // EndPrimitive(); 245 }
Note: See TracChangeset
for help on using the changeset viewer.