BRGRender.cs 3.2 KB

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