BRGRender.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System.Collections.Generic;
  2. using Unity.Collections;
  3. using Unity.Mathematics;
  4. using UnityEngine;
  5. using UnityEngine.Rendering;
  6. using Utility;
  7. namespace Core.BRG
  8. {
  9. public class BRGRender<T> : BRGRenderBasic where T : BGRGameObjectInfo
  10. {
  11. /// <summary>
  12. /// BRG容器对象
  13. /// </summary>
  14. // private BRGRenderBasic _mBrgRenderBasic;
  15. // private int m_itemCount;
  16. public bool isUpdate = true;
  17. public List<T> m_gameObjectInfos = new List<T>();
  18. private List<BatchShaderBind> m_batchShaderBinds = new List<BatchShaderBind>();
  19. private Map<string, BatchShaderBind> m_batchShaderBindMap = new Map<string, BatchShaderBind>();
  20. public void InitRender(BRGSamples samples, List<T> gameObjectInfos)
  21. {
  22. this.m_gameObjectInfos = gameObjectInfos;
  23. int maxItemSize = samples.GetAllShaderValueSize();
  24. Init(samples, gameObjectInfos.Count, maxItemSize);
  25. UploadGpuData(gameObjectInfos.Count);
  26. }
  27. protected override NativeArray<MetadataValue> ProInitBatchMetadata(int startOffset, int m_maxInstancePerWindow)
  28. {
  29. NativeArray<MetadataValue> metadataValues =
  30. new NativeArray<MetadataValue>(m_samples.AllShaderValues.Count, Allocator.Temp,
  31. NativeArrayOptions.UninitializedMemory);
  32. m_batchShaderBinds.Clear();
  33. // int count= m_maxInstancePerWindow;
  34. for (int i = 0; i < m_samples.AllShaderValues.Count; i++)
  35. {
  36. BRGShaderValue shaderValue = m_samples.AllShaderValues[i];
  37. int shaderId = Shader.PropertyToID(shaderValue.key);
  38. BatchShaderBind batchShaderBind = new BatchShaderBind();
  39. metadataValues[i] = CreateMetadataValue(shaderId, startOffset, true);
  40. batchShaderBind.shaderValue = shaderValue;
  41. batchShaderBind.offset = startOffset;
  42. batchShaderBind.InitBuffer(m_maxInstancePerWindow);
  43. startOffset += shaderValue.GetSize() * m_maxInstancePerWindow;
  44. m_batchShaderBinds.Add(batchShaderBind);
  45. m_batchShaderBindMap.Add(shaderValue.key, batchShaderBind);
  46. }
  47. return metadataValues;
  48. }
  49. public void UpdatePos()
  50. {
  51. if (!isUpdate)
  52. {
  53. return;
  54. }
  55. int totalGpuBufferSize;
  56. int alignedWindowSize;
  57. NativeArray<float3x4> sysmemBuffer =
  58. GetSysmemBuffer(out totalGpuBufferSize, out alignedWindowSize);
  59. // 检查NativeArray是否有效
  60. if (!sysmemBuffer.IsCreated)
  61. {
  62. Debug.LogError("NativeArray has been deallocated or not created properly");
  63. return;
  64. }
  65. int m_itemCount = m_gameObjectInfos.Count;
  66. m_batchShaderBindMap.TryGetValue("_MainColor", out var baseColorBind);
  67. for (int i = 0; i < m_gameObjectInfos.Count; i++)
  68. {
  69. BGRGameObjectInfo info = m_gameObjectInfos[i];
  70. Matrix4x4 matrix4X4 = info.objectToWorld;
  71. float4x4 float3X4 = matrix4X4;
  72. sysmemBuffer[i] = new float3x4(
  73. float3X4.c0.xyz, float3X4.c1.xyz,
  74. float3X4.c2.xyz, float3X4.c3.xyz
  75. );
  76. float4x4 inverse = matrix4X4.inverse;
  77. sysmemBuffer[i + m_itemCount] = new float3x4(
  78. inverse.c0.xyz, inverse.c1.xyz,
  79. inverse.c2.xyz, inverse.c3.xyz
  80. );
  81. if (baseColorBind != null)
  82. {
  83. baseColorBind.SetData(i, info.color);
  84. }
  85. }
  86. // 每帧更新后重新上传数据到GPU
  87. UploadGpuData(m_itemCount, m_batchShaderBinds);
  88. }
  89. }
  90. }