Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }