CPUParticle.fx 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. //////////////////////////////////////////////////////////////////////////////
  2. // ©2005 Electronic Arts Inc
  3. //
  4. // FX Shader for particles
  5. //////////////////////////////////////////////////////////////////////////////
  6. #include "Common.fxh"
  7. #include "Gamma.fxh"
  8. #include "CommonParticle.fxh"
  9. SAMPLER_2D_BEGIN(ParticleTexture,
  10. string UIWidget = "None";
  11. string SasBindAddress = "Particle.Draw.Texture";
  12. )
  13. MinFilter = Linear;
  14. MagFilter = Linear;
  15. MipFilter = Linear;
  16. AddressU = Clamp;
  17. AddressV = Clamp;
  18. SAMPLER_2D_END
  19. // ----------------------------------------------------------------------------
  20. // Transformations
  21. // ----------------------------------------------------------------------------
  22. float4x4 Projection : Projection;
  23. float4x3 View : View;
  24. #if defined(_WW3D_)
  25. #if !defined(USE_INDIRECT_CONSTANT)
  26. float4x4 ViewProjection
  27. <
  28. string UIWidget = "None";
  29. string SasBindAddress = "Sas.Camera.WorldToProjection";
  30. >;
  31. #endif // #if !defined(USE_INDIRECT_CONSTANT)
  32. float4x4 GetViewProjection()
  33. {
  34. return ViewProjection;
  35. }
  36. #else
  37. float4x4 GetViewProjection()
  38. {
  39. return mul(View, Projection);
  40. }
  41. #endif
  42. // ----------------------------------------------------------------------------
  43. // Vertex shader
  44. // ----------------------------------------------------------------------------
  45. struct VSInput
  46. {
  47. float4 Position_Index : POSITION; // position (xyz), index (w)
  48. float2 Angle_Size : TEXCOORD0; // angle (x), size (y)
  49. float4 VertexColor : COLOR0; // color
  50. };
  51. struct VSOutput
  52. {
  53. float4 Position : POSITION;
  54. float4 DiffuseColor : COLOR0;
  55. float2 BaseTexCoord : TEXCOORD0;
  56. };
  57. VSOutput VS_Billboard(VSInput In)
  58. {
  59. VSOutput Out;
  60. // compute the z rotation matrix
  61. float zRotation = In.Angle_Size.x;
  62. float2x2 zRotationMatrix;
  63. zRotationMatrix[0][0] = cos(zRotation);
  64. zRotationMatrix[0][1] = -sin(zRotation);
  65. zRotationMatrix[1][1] = zRotationMatrix[0][0];
  66. zRotationMatrix[1][0] = -zRotationMatrix[0][1];
  67. // compute the vertex corners
  68. float Index = In.Position_Index.w;
  69. float2 vertexCorner = VertexCorners[Index];
  70. float2 relativeCornerPos = mul(vertexCorner, zRotationMatrix);
  71. float size = In.Angle_Size.y;
  72. float3 xVector = float3( View[0][0], View[1][0], View[2][0] );
  73. float3 zVector = float3( View[0][1], View[1][1], View[2][1] );
  74. float3 cornerPosition = In.Position_Index.xyz + size * (relativeCornerPos.x * xVector + relativeCornerPos.y * zVector);
  75. Out.Position = mul(float4(cornerPosition, 1), GetViewProjection());
  76. Out.DiffuseColor = In.VertexColor;
  77. Out.BaseTexCoord = GetVertexTexCoord(vertexCorner);
  78. return Out;
  79. }
  80. VSOutput VS_NoBillboard(VSInput In)
  81. {
  82. VSOutput Out;
  83. // compute the z rotation matrix
  84. float zRotation = In.Angle_Size.x;
  85. float2x2 zRotationMatrix;
  86. zRotationMatrix[0][0] = cos(zRotation);
  87. zRotationMatrix[0][1] = -sin(zRotation);
  88. zRotationMatrix[1][1] = zRotationMatrix[0][0];
  89. zRotationMatrix[1][0] = -zRotationMatrix[0][1];
  90. // compute the vertex corners
  91. float Index = In.Position_Index.w;
  92. float2 vertexCorner = VertexCorners[Index];
  93. float2 relativeCornerPos = mul(vertexCorner, zRotationMatrix);
  94. float size = In.Angle_Size.y;
  95. float3 cornerPosition = float3( In.Position_Index.xy + ( size * relativeCornerPos ), In.Position_Index.z );
  96. Out.Position = mul(float4(cornerPosition, 1), GetViewProjection());
  97. Out.DiffuseColor = In.VertexColor;
  98. Out.BaseTexCoord = GetVertexTexCoord(vertexCorner);
  99. return Out;
  100. }
  101. // ----------------------------------------------------------------------------
  102. // Pixel Shader
  103. // ----------------------------------------------------------------------------
  104. float4 PS(VSOutput In) : COLOR
  105. {
  106. float4 color = In.DiffuseColor;
  107. // Apply texture
  108. float4 baseTexture = tex2D(SAMPLER(ParticleTexture), In.BaseTexCoord);
  109. baseTexture.xyz = GammaToLinear(baseTexture.xyz);
  110. color *= baseTexture;
  111. return color;
  112. }
  113. float4 PS_M(VSOutput In) : COLOR
  114. {
  115. float4 color = In.DiffuseColor;
  116. // Apply texture
  117. color *= tex2D(SAMPLER(ParticleTexture), In.BaseTexCoord);
  118. return color;
  119. }
  120. //--------------------------------------------------------------------------
  121. // No billboard techniques
  122. //--------------------------------------------------------------------------
  123. technique AdditiveSpriteShader
  124. {
  125. pass P0
  126. {
  127. VertexShader = compile VS_2_0 VS_NoBillboard();
  128. PixelShader = compile PS_2_0 PS();
  129. ZEnable = true;
  130. ZFunc = ZFUNC_INFRONT;
  131. ZWriteEnable = false;
  132. CullMode = None;
  133. AlphaBlendEnable = true;
  134. SrcBlend = One;
  135. DestBlend = One;
  136. AlphaTestEnable = false;
  137. }
  138. }
  139. //--------------------------------------------------------------------------
  140. technique AdditiveAlphaTestSpriteShader
  141. {
  142. pass P0
  143. {
  144. VertexShader = compile VS_2_0 VS_NoBillboard();
  145. PixelShader = compile PS_2_0 PS();
  146. ZEnable = true;
  147. ZFunc = ZFUNC_INFRONT;
  148. ZWriteEnable = false;
  149. CullMode = None;
  150. AlphaBlendEnable = true;
  151. SrcBlend = One;
  152. DestBlend = One;
  153. AlphaTestEnable = true;
  154. AlphaFunc = GreaterEqual;
  155. AlphaRef = DEFAULT_ALPHATEST_THRESHOLD;
  156. }
  157. }
  158. //--------------------------------------------------------------------------
  159. technique AlphaSpriteShader
  160. {
  161. pass P0
  162. {
  163. VertexShader = compile VS_2_0 VS_NoBillboard();
  164. PixelShader = compile PS_2_0 PS();
  165. ZEnable = true;
  166. ZFunc = ZFUNC_INFRONT;
  167. ZWriteEnable = false;
  168. CullMode = None;
  169. AlphaBlendEnable = true;
  170. SrcBlend = SrcAlpha;
  171. DestBlend = InvSrcAlpha;
  172. AlphaTestEnable = false;
  173. }
  174. }
  175. //--------------------------------------------------------------------------
  176. technique ATestSpriteShader
  177. {
  178. pass P0
  179. {
  180. VertexShader = compile VS_2_0 VS_NoBillboard();
  181. PixelShader = compile PS_2_0 PS();
  182. ZEnable = true;
  183. ZFunc = ZFUNC_INFRONT;
  184. ZWriteEnable = false;
  185. CullMode = None;
  186. AlphaBlendEnable = false;
  187. AlphaTestEnable = true;
  188. AlphaFunc = GreaterEqual;
  189. AlphaRef = DEFAULT_ALPHATEST_THRESHOLD;
  190. }
  191. }
  192. //--------------------------------------------------------------------------
  193. technique MultiplicativeSpriteShader
  194. {
  195. pass P0
  196. {
  197. VertexShader = compile VS_2_0 VS_NoBillboard();
  198. PixelShader = compile PS_2_0 PS();
  199. ZEnable = true;
  200. ZFunc = ZFUNC_INFRONT;
  201. ZWriteEnable = false;
  202. CullMode = None;
  203. AlphaBlendEnable = true;
  204. SrcBlend = DestColor;
  205. DestBlend = Zero;
  206. AlphaTestEnable = false;
  207. }
  208. }
  209. //--------------------------------------------------------------------------
  210. technique Additive2DShader
  211. {
  212. pass P0
  213. {
  214. VertexShader = compile VS_2_0 VS_NoBillboard();
  215. PixelShader = compile PS_2_0 PS();
  216. ZEnable = false;
  217. ZWriteEnable = false;
  218. CullMode = None;
  219. AlphaBlendEnable = true;
  220. SrcBlend = One;
  221. DestBlend = One;
  222. AlphaTestEnable = false;
  223. }
  224. }
  225. //--------------------------------------------------------------------------
  226. technique Alpha2DShader
  227. {
  228. pass P0
  229. {
  230. VertexShader = compile VS_2_0 VS_NoBillboard();
  231. PixelShader = compile PS_2_0 PS();
  232. ZEnable = false;
  233. ZWriteEnable = false;
  234. CullMode = None;
  235. AlphaBlendEnable = true;
  236. SrcBlend = SrcAlpha;
  237. DestBlend = InvSrcAlpha;
  238. AlphaTestEnable = false;
  239. }
  240. }
  241. //--------------------------------------------------------------------------
  242. // Billboard techniques
  243. //--------------------------------------------------------------------------
  244. technique AdditiveSpriteShaderBillboard
  245. {
  246. pass P0
  247. {
  248. VertexShader = compile VS_2_0 VS_Billboard();
  249. PixelShader = compile PS_2_0 PS();
  250. ZEnable = true;
  251. ZFunc = ZFUNC_INFRONT;
  252. ZWriteEnable = false;
  253. CullMode = None;
  254. AlphaBlendEnable = true;
  255. SrcBlend = One;
  256. DestBlend = One;
  257. AlphaTestEnable = false;
  258. }
  259. }
  260. //--------------------------------------------------------------------------
  261. technique AdditiveAlphaTestSpriteShaderBillboard
  262. {
  263. pass P0
  264. {
  265. VertexShader = compile VS_2_0 VS_Billboard();
  266. PixelShader = compile PS_2_0 PS();
  267. ZEnable = true;
  268. ZFunc = ZFUNC_INFRONT;
  269. ZWriteEnable = false;
  270. CullMode = None;
  271. AlphaBlendEnable = true;
  272. SrcBlend = One;
  273. DestBlend = One;
  274. AlphaTestEnable = true;
  275. AlphaFunc = GreaterEqual;
  276. AlphaRef = DEFAULT_ALPHATEST_THRESHOLD;
  277. }
  278. }
  279. //--------------------------------------------------------------------------
  280. technique AlphaSpriteShaderBillboard
  281. {
  282. pass P0
  283. {
  284. VertexShader = compile VS_2_0 VS_Billboard();
  285. PixelShader = compile PS_2_0 PS();
  286. ZEnable = true;
  287. ZFunc = ZFUNC_INFRONT;
  288. ZWriteEnable = false;
  289. CullMode = None;
  290. AlphaBlendEnable = true;
  291. SrcBlend = SrcAlpha;
  292. DestBlend = InvSrcAlpha;
  293. AlphaTestEnable = false;
  294. }
  295. }
  296. //--------------------------------------------------------------------------
  297. technique ATestSpriteShaderBillboard
  298. {
  299. pass P0
  300. {
  301. VertexShader = compile VS_2_0 VS_Billboard();
  302. PixelShader = compile PS_2_0 PS();
  303. ZEnable = true;
  304. ZFunc = ZFUNC_INFRONT;
  305. ZWriteEnable = false;
  306. CullMode = None;
  307. AlphaBlendEnable = false;
  308. AlphaTestEnable = true;
  309. AlphaFunc = GreaterEqual;
  310. AlphaRef = DEFAULT_ALPHATEST_THRESHOLD;
  311. }
  312. }
  313. //--------------------------------------------------------------------------
  314. technique MultiplicativeSpriteShaderBillboard
  315. {
  316. pass P0
  317. {
  318. VertexShader = compile VS_2_0 VS_Billboard();
  319. PixelShader = compile PS_2_0 PS();
  320. ZEnable = true;
  321. ZFunc = ZFUNC_INFRONT;
  322. ZWriteEnable = false;
  323. CullMode = None;
  324. AlphaBlendEnable = true;
  325. SrcBlend = DestColor;
  326. DestBlend = Zero;
  327. AlphaTestEnable = false;
  328. }
  329. }
  330. //--------------------------------------------------------------------------
  331. technique Additive2DShaderBillboard
  332. {
  333. pass P0
  334. {
  335. VertexShader = compile VS_2_0 VS_Billboard();
  336. PixelShader = compile PS_2_0 PS();
  337. ZEnable = false;
  338. ZWriteEnable = false;
  339. CullMode = None;
  340. AlphaBlendEnable = true;
  341. SrcBlend = One;
  342. DestBlend = One;
  343. AlphaTestEnable = false;
  344. }
  345. }
  346. //--------------------------------------------------------------------------
  347. technique Alpha2DShaderBillboard
  348. {
  349. pass P0
  350. {
  351. VertexShader = compile VS_2_0 VS_Billboard();
  352. PixelShader = compile PS_2_0 PS();
  353. ZEnable = false;
  354. ZWriteEnable = false;
  355. CullMode = None;
  356. AlphaBlendEnable = true;
  357. SrcBlend = SrcAlpha;
  358. DestBlend = InvSrcAlpha;
  359. AlphaTestEnable = false;
  360. }
  361. }
  362. //
  363. // Medium LOD versions
  364. //
  365. //--------------------------------------------------------------------------
  366. // No billboard techniques
  367. //--------------------------------------------------------------------------
  368. technique AdditiveSpriteShader_M
  369. {
  370. pass P0
  371. {
  372. VertexShader = compile VS_2_0 VS_NoBillboard();
  373. PixelShader = compile PS_2_0 PS_M();
  374. ZEnable = true;
  375. ZFunc = ZFUNC_INFRONT;
  376. ZWriteEnable = false;
  377. CullMode = None;
  378. AlphaBlendEnable = true;
  379. SrcBlend = One;
  380. DestBlend = One;
  381. AlphaTestEnable = false;
  382. }
  383. }
  384. //--------------------------------------------------------------------------
  385. technique AdditiveAlphaTestSpriteShader_M
  386. {
  387. pass P0
  388. {
  389. VertexShader = compile VS_2_0 VS_NoBillboard();
  390. PixelShader = compile PS_2_0 PS_M();
  391. ZEnable = true;
  392. ZFunc = ZFUNC_INFRONT;
  393. ZWriteEnable = false;
  394. CullMode = None;
  395. AlphaBlendEnable = true;
  396. SrcBlend = One;
  397. DestBlend = One;
  398. AlphaTestEnable = true;
  399. AlphaFunc = GreaterEqual;
  400. AlphaRef = DEFAULT_ALPHATEST_THRESHOLD;
  401. }
  402. }
  403. //--------------------------------------------------------------------------
  404. technique AlphaSpriteShader_M
  405. {
  406. pass P0
  407. {
  408. VertexShader = compile VS_2_0 VS_NoBillboard();
  409. PixelShader = compile PS_2_0 PS_M();
  410. ZEnable = true;
  411. ZFunc = ZFUNC_INFRONT;
  412. ZWriteEnable = false;
  413. CullMode = None;
  414. AlphaBlendEnable = true;
  415. SrcBlend = SrcAlpha;
  416. DestBlend = InvSrcAlpha;
  417. AlphaTestEnable = false;
  418. }
  419. }
  420. //--------------------------------------------------------------------------
  421. technique ATestSpriteShader_M
  422. {
  423. pass P0
  424. {
  425. VertexShader = compile VS_2_0 VS_NoBillboard();
  426. PixelShader = compile PS_2_0 PS_M();
  427. ZEnable = true;
  428. ZFunc = ZFUNC_INFRONT;
  429. ZWriteEnable = false;
  430. CullMode = None;
  431. AlphaBlendEnable = false;
  432. AlphaTestEnable = true;
  433. AlphaFunc = GreaterEqual;
  434. AlphaRef = DEFAULT_ALPHATEST_THRESHOLD;
  435. }
  436. }
  437. //--------------------------------------------------------------------------
  438. technique MultiplicativeSpriteShader_M
  439. {
  440. pass P0
  441. {
  442. VertexShader = compile VS_2_0 VS_NoBillboard();
  443. PixelShader = compile PS_2_0 PS_M();
  444. ZEnable = true;
  445. ZFunc = ZFUNC_INFRONT;
  446. ZWriteEnable = false;
  447. CullMode = None;
  448. AlphaBlendEnable = true;
  449. SrcBlend = DestColor;
  450. DestBlend = Zero;
  451. AlphaTestEnable = false;
  452. }
  453. }
  454. //--------------------------------------------------------------------------
  455. technique Additive2DShader_M
  456. {
  457. pass P0
  458. {
  459. VertexShader = compile VS_2_0 VS_NoBillboard();
  460. PixelShader = compile PS_2_0 PS_M();
  461. ZEnable = false;
  462. ZWriteEnable = false;
  463. CullMode = None;
  464. AlphaBlendEnable = true;
  465. SrcBlend = One;
  466. DestBlend = One;
  467. AlphaTestEnable = false;
  468. }
  469. }
  470. //--------------------------------------------------------------------------
  471. technique Alpha2DShader_M
  472. {
  473. pass P0
  474. {
  475. VertexShader = compile VS_2_0 VS_NoBillboard();
  476. PixelShader = compile PS_2_0 PS_M();
  477. ZEnable = false;
  478. ZWriteEnable = false;
  479. CullMode = None;
  480. AlphaBlendEnable = true;
  481. SrcBlend = SrcAlpha;
  482. DestBlend = InvSrcAlpha;
  483. AlphaTestEnable = false;
  484. }
  485. }
  486. //--------------------------------------------------------------------------
  487. // Billboard techniques
  488. //--------------------------------------------------------------------------
  489. technique AdditiveSpriteShaderBillboard_M
  490. {
  491. pass P0
  492. {
  493. VertexShader = compile VS_2_0 VS_Billboard();
  494. PixelShader = compile PS_2_0 PS_M();
  495. ZEnable = true;
  496. ZFunc = ZFUNC_INFRONT;
  497. ZWriteEnable = false;
  498. CullMode = None;
  499. AlphaBlendEnable = true;
  500. SrcBlend = One;
  501. DestBlend = One;
  502. AlphaTestEnable = false;
  503. }
  504. }
  505. //--------------------------------------------------------------------------
  506. technique AdditiveAlphaTestSpriteShaderBillboard_M
  507. {
  508. pass P0
  509. {
  510. VertexShader = compile VS_2_0 VS_Billboard();
  511. PixelShader = compile PS_2_0 PS_M();
  512. ZEnable = true;
  513. ZFunc = ZFUNC_INFRONT;
  514. ZWriteEnable = false;
  515. CullMode = None;
  516. AlphaBlendEnable = true;
  517. SrcBlend = One;
  518. DestBlend = One;
  519. AlphaTestEnable = true;
  520. AlphaFunc = GreaterEqual;
  521. AlphaRef = DEFAULT_ALPHATEST_THRESHOLD;
  522. }
  523. }
  524. //--------------------------------------------------------------------------
  525. technique AlphaSpriteShaderBillboard_M
  526. {
  527. pass P0
  528. {
  529. VertexShader = compile VS_2_0 VS_Billboard();
  530. PixelShader = compile PS_2_0 PS_M();
  531. ZEnable = true;
  532. ZFunc = ZFUNC_INFRONT;
  533. ZWriteEnable = false;
  534. CullMode = None;
  535. AlphaBlendEnable = true;
  536. SrcBlend = SrcAlpha;
  537. DestBlend = InvSrcAlpha;
  538. AlphaTestEnable = false;
  539. }
  540. }
  541. //--------------------------------------------------------------------------
  542. technique ATestSpriteShaderBillboard_M
  543. {
  544. pass P0
  545. {
  546. VertexShader = compile VS_2_0 VS_Billboard();
  547. PixelShader = compile PS_2_0 PS_M();
  548. ZEnable = true;
  549. ZFunc = ZFUNC_INFRONT;
  550. ZWriteEnable = false;
  551. CullMode = None;
  552. AlphaBlendEnable = false;
  553. AlphaTestEnable = true;
  554. AlphaFunc = GreaterEqual;
  555. AlphaRef = DEFAULT_ALPHATEST_THRESHOLD;
  556. }
  557. }
  558. //--------------------------------------------------------------------------
  559. technique MultiplicativeSpriteShaderBillboard_M
  560. {
  561. pass P0
  562. {
  563. VertexShader = compile VS_2_0 VS_Billboard();
  564. PixelShader = compile PS_2_0 PS_M();
  565. ZEnable = true;
  566. ZFunc = ZFUNC_INFRONT;
  567. ZWriteEnable = false;
  568. CullMode = None;
  569. AlphaBlendEnable = true;
  570. SrcBlend = DestColor;
  571. DestBlend = Zero;
  572. AlphaTestEnable = false;
  573. }
  574. }
  575. //--------------------------------------------------------------------------
  576. technique Additive2DShaderBillboard_M
  577. {
  578. pass P0
  579. {
  580. VertexShader = compile VS_2_0 VS_Billboard();
  581. PixelShader = compile PS_2_0 PS_M();
  582. ZEnable = false;
  583. ZWriteEnable = false;
  584. CullMode = None;
  585. AlphaBlendEnable = true;
  586. SrcBlend = One;
  587. DestBlend = One;
  588. AlphaTestEnable = false;
  589. }
  590. }
  591. //--------------------------------------------------------------------------
  592. technique Alpha2DShaderBillboard_M
  593. {
  594. pass P0
  595. {
  596. VertexShader = compile VS_2_0 VS_Billboard();
  597. PixelShader = compile PS_2_0 PS_M();
  598. ZEnable = false;
  599. ZWriteEnable = false;
  600. CullMode = None;
  601. AlphaBlendEnable = true;
  602. SrcBlend = SrcAlpha;
  603. DestBlend = InvSrcAlpha;
  604. AlphaTestEnable = false;
  605. }
  606. }