示例#1
0
    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;
    }
示例#2
0
    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;
    }