/// <summary> /// 拾取场景物体建立渲染批次 /// </summary> /// <param name="staticOnly"></param> /// <param name="ignoreSkinnedMeshRenderer"></param> /// <returns></returns> public static List <AOBakeBatch> CollectBatches(bool staticOnly, bool ignoreSkinnedMeshRenderer) { List <AOBakeBatch> batches = new List <AOBakeBatch>(); MeshRenderer[] mr = Object.FindObjectsOfType <MeshRenderer>(); for (int i = 0; i < mr.Length; i++) { if (staticOnly && !mr[i].gameObject.isStatic) { continue; } Material mat = mr[i].sharedMaterial; if (mat && mat.renderQueue >= (int)RenderQueue.AlphaTest) { continue; } var batch = AOBakeBatch.CreateBatch(mr[i].gameObject); if (batch != null) { batches.Add(batch); } } if (!ignoreSkinnedMeshRenderer) { SkinnedMeshRenderer[] skmr = Object.FindObjectsOfType <SkinnedMeshRenderer>(); for (int i = 0; i < skmr.Length; i++) { if (staticOnly && !skmr[i].gameObject.isStatic) { continue; } Material mat = skmr[i].sharedMaterial; if (mat && mat.renderQueue >= (int)RenderQueue.AlphaTest) { continue; } var batch = AOBakeBatch.CreateBatch(skmr[i].gameObject); if (batch != null) { batches.Add(batch); } } } return(batches); }
/// <summary> /// 执行光纤追踪 /// </summary> /// <param name="batch"></param> /// <param name="vertexGroup"></param> /// <param name="renderTarget"></param> /// <param name="preTex"></param> private void Raytracing(AOBakeBatch batch, AOBakeBatchVertexGroup vertexGroup, RenderTexture renderTarget, RenderTexture preTex) { m_BakeMaterial.SetTexture("_PreTex", preTex);//传入之前的结果,确保每次渲染都是基于之前的结果 m_BakeMaterial.SetVectorArray("_Vertices", vertexGroup.vertices); m_BakeMaterial.SetFloat("_VertexCount", vertexGroup.vertexCount); if (m_CurrentBatch != batch) { m_CurrentBatch = batch; m_BakeMaterial.SetMatrix("_LocalToWorld", batch.localToWorld); } m_CommandBuffer.Clear(); m_CommandBuffer.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); m_CommandBuffer.SetRenderTarget(renderTarget); m_CommandBuffer.DrawMesh(m_MeshFilter.sharedMesh, m_MeshFilter.transform.localToWorldMatrix, m_BakeMaterial, 0, 0); }