GPURender.cs 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using System;
  2. using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
  3. using UnityEngine;
  4. namespace GameLogic.Combat.Hero.HeroGPU
  5. {
  6. public class GPURender
  7. {
  8. private static readonly int shader_enableShaderId = Shader.PropertyToID("_EnableAnimation");
  9. readonly int shader_animtionStateId = Shader.PropertyToID("_AnimationState");
  10. readonly int shader_edgeColor = Shader.PropertyToID("_edgeColor");
  11. readonly int shader_edgeStrength = Shader.PropertyToID("_edgeStrength");
  12. readonly int shader_injuriedStrength = Shader.PropertyToID("_injuriedStrength");
  13. public Material Material;
  14. public Mesh Mesh;
  15. public MaterialPropertyBlock _materialPropertyBlock;
  16. BetterList<Matrix4x4> instData = new BetterList<Matrix4x4>(100);
  17. BetterList<Matrix4x4> animtionStata = new BetterList<Matrix4x4>(100);
  18. BetterList<float> enableAnimations = new BetterList<float>(100);
  19. BetterList<Vector4> edgeColor = new BetterList<Vector4>(100);
  20. BetterList<float> edgeStrength = new BetterList<float>(100);
  21. BetterList<float> injuriedStrength = new BetterList<float>(100);
  22. private RenderParams rp;
  23. public void Init(Material Material, Mesh Mesh)
  24. {
  25. this.Material = Material;
  26. this.Mesh = Mesh;
  27. _materialPropertyBlock = new MaterialPropertyBlock();
  28. rp = new RenderParams(Material);
  29. rp.matProps = _materialPropertyBlock;
  30. rp.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;
  31. rp.receiveShadows = false;
  32. }
  33. public void Render(BetterList<HeroGPUMono> gpuMonoList)
  34. {
  35. int count = gpuMonoList.Count;
  36. if (count <= 0)
  37. {
  38. return;
  39. }
  40. _materialPropertyBlock.Clear();
  41. // Matrix4x4[] instData = new Matrix4x4[count];
  42. // Matrix4x4[] animtionStata = new Matrix4x4[count];
  43. // float[] enableAnimations = new float[count];
  44. // Vector4[] edgeColor = new Vector4[count];
  45. // float[] edgeStrength = new float[count];
  46. // float[] injuriedStrength = new float[count];
  47. instData.Clear();
  48. animtionStata.Clear();
  49. enableAnimations.Clear();
  50. edgeColor.Clear();
  51. edgeStrength.Clear();
  52. injuriedStrength.Clear();
  53. int rendCombat = 0;
  54. for (int i = 0; i < count; i++)
  55. {
  56. HeroGPUMono heroGPUMono = gpuMonoList[i];
  57. if (!heroGPUMono.gameObject.activeSelf)
  58. {
  59. continue;
  60. }
  61. rendCombat++;
  62. instData.Add(heroGPUMono.rootTrans.localToWorldMatrix);
  63. animtionStata.Add(heroGPUMono.animtionState);
  64. edgeColor.Add(heroGPUMono.edgecolor);
  65. edgeStrength.Add(heroGPUMono.edgeStength);
  66. injuriedStrength.Add(heroGPUMono.injuriedStrength);
  67. enableAnimations.Add(1);
  68. }
  69. _materialPropertyBlock.SetFloatArray(shader_enableShaderId, enableAnimations.ToArray(true));
  70. _materialPropertyBlock.SetMatrixArray(shader_animtionStateId, animtionStata.ToArray(true));
  71. _materialPropertyBlock.SetVectorArray(shader_edgeColor, edgeColor.ToArray(true));
  72. _materialPropertyBlock.SetFloatArray(shader_edgeStrength, edgeStrength.ToArray(true));
  73. _materialPropertyBlock.SetFloatArray(shader_injuriedStrength, injuriedStrength.ToArray(true));
  74. Graphics.RenderMeshInstanced(rp, Mesh, 0, instData.ToArray(true), rendCombat, 0);
  75. }
  76. }
  77. }