using System.Collections.Generic; using Unity.Collections; using Unity.Mathematics; using UnityEngine; using UnityEngine.Rendering; namespace Core.BRG { public class BRGRender : BRGRenderBasic where T : BGRGameObjectInfo { /// /// BRG容器对象 /// // private BRGRenderBasic _mBrgRenderBasic; // private int m_itemCount; public bool isUpdate = true; public List m_gameObjectInfos = new List(); private List m_batchShaderBinds = new List(); public void InitRender(BRGSamples samples, List gameObjectInfos) { this.m_gameObjectInfos = gameObjectInfos; int maxItemSize = samples.GetAllShaderValueSize(); Init(samples, gameObjectInfos.Count, maxItemSize); UploadGpuData(gameObjectInfos.Count); } protected override NativeArray ProInitBatchMetadata(int startOffset,int m_maxInstancePerWindow) { NativeArray metadataValues = new NativeArray(m_samples.AllShaderValues.Count,Allocator.Temp, NativeArrayOptions.UninitializedMemory); m_batchShaderBinds.Clear(); int count= m_gameObjectInfos.Count; for (int i = 0; i < m_samples.AllShaderValues.Count; i++) { // BRGShaderValue shaderValue = m_samples.AllShaderValues[i]; // int shaderId = Shader.PropertyToID(shaderValue.); // BatchShaderBind batchShaderBind = new BatchShaderBind(); // batchMetadata[0] = CreateMetadataValue(objectToWorldID, 0, true); } return base.ProInitBatchMetadata(startOffset,m_maxInstancePerWindow); } public void UpdatePos() { if (!isUpdate) { return; } int totalGpuBufferSize; int alignedWindowSize; NativeArray sysmemBuffer = GetSysmemBuffer(out totalGpuBufferSize, out alignedWindowSize); // 检查NativeArray是否有效 if (!sysmemBuffer.IsCreated) { Debug.LogError("NativeArray has been deallocated or not created properly"); return; } int m_itemCount = m_gameObjectInfos.Count; for (int i = 0; i < m_gameObjectInfos.Count; i++) { BGRGameObjectInfo info = m_gameObjectInfos[i]; Matrix4x4 matrix4X4 = info.objectToWorld; float4x4 float3X4 = matrix4X4; sysmemBuffer[i] = new float3x4( float3X4.c0.xyz, float3X4.c1.xyz, float3X4.c2.xyz, float3X4.c3.xyz ); float4x4 inverse = matrix4X4.inverse; sysmemBuffer[i + m_itemCount] = new float3x4( inverse.c0.xyz, inverse.c1.xyz, inverse.c2.xyz, inverse.c3.xyz ); } // 每帧更新后重新上传数据到GPU UploadTransformData(m_itemCount); } } }