GPURender.cs 3.4 KB

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