public void InitCommandBuffer(GPUInstancingObj obj) { if (KdTreeCameraClipper.IsAppQuit || !obj.IsVaild()) { RemoveFromCurrCamera(); return; } if (m_CmdBuffer == null) { m_CmdBuffer = new CommandBuffer(); } else { m_CmdBuffer.Clear(); } Camera cam = this.CurrCamera; if (cam == null) { return; } // 有点问题 //m_CmdBuffer.DrawMeshInstanced (obj.mesh, 0, obj.sharedMaterial, 0, obj.matrixList); cam.AddCommandBuffer(CameraEvent.AfterForwardOpaque, m_CmdBuffer); m_DoCamera = true; }
void ProcessGPUInstancingVisibleChanged(Renderer r, bool isVisible) { if (r == null) { return; } MeshRenderer meshRenderer = r as MeshRenderer; if (meshRenderer == null) { return; } //var mats = meshRenderer.sharedMaterials; //if (mats == null) // return; MeshFilter filter = meshRenderer.GetComponent <MeshFilter>(); if (filter == null) { return; } Mesh mesh = filter.sharedMesh; if (mesh == null) { return; } bool isVaildScene = IsVaildScene(r); if (!isVaildScene) { return; } int instanceId = mesh.GetInstanceID(); GPUInstancingKey key = new GPUInstancingKey(); key.meshInstanceID = instanceId; if (meshRenderer.sharedMaterial != null) { key.SharedMaterials = meshRenderer.sharedMaterial.GetInstanceID(); } else { key.SharedMaterials = 0; } GPUInstancingObj obj; if (!m_GPUInstancingMap.TryGetValue(key, out obj)) { if (!isVisible) { return; } obj = new GPUInstancingObj(); obj.mesh = mesh; obj.sharedMaterials = meshRenderer.sharedMaterials; obj.receiveShadow = meshRenderer.receiveShadows; obj.shadowCastingMode = meshRenderer.shadowCastingMode; obj.layer = meshRenderer.gameObject.layer; //meshRenderer.SetPropertyBlock (obj.propBlock); #if !UNITY_EDITOR if (mesh.isReadable) { mesh.UploadMeshData(true); } #endif } if (isVisible) { obj.AddMatrix(meshRenderer); } else { obj.RemoveMatrix(meshRenderer); } m_GPUInstancingMap [key] = obj; }