Ejemplo n.º 1
0
 public void ReCreateCBuffer(CRenderContext rc, CGfxEffect effect, bool FlushVars)
 {
     if (effect.CacheData.PerInstanceId != UInt32.MaxValue)
     {
         bool recreateCB = false;
         if (mCBuffer != null)
         {
             var desc = new CConstantBufferDesc();
             effect.ShaderProgram.GetCBufferDesc(effect.CacheData.PerInstanceId, ref desc);
             if (mCBuffer.Size != desc.Size)
             {
                 recreateCB = true;
             }
             else
             {
                 recreateCB = !mCBuffer.IsSameVars(effect.ShaderProgram, effect.CacheData.PerInstanceId);
             }
         }
         else
         {
             recreateCB = true;
         }
         if (recreateCB)
         {
             mCBuffer = rc.CreateConstantBuffer(effect.ShaderProgram, effect.CacheData.PerInstanceId);
             MtlInst.SetCBufferVars(CBuffer);
         }
         else if (FlushVars)
         {
             MtlInst.SetCBufferVars(CBuffer);
         }
     }
 }
Ejemplo n.º 2
0
        private void UpdateMaterialCBuffer(CRenderContext rc, CGfxEffect effect)
        {
            var cbIndex = effect.CacheData.PerInstanceId;// effect.ShaderProgram.FindCBuffer("cbPerInstance");

            if ((int)cbIndex >= 0)
            {
                PassData2ConstBufferPerTick(null);

                MtlInst.SetCBufferVars(CBuffer);
            }
        }
Ejemplo n.º 3
0
            internal async System.Threading.Tasks.Task UpdateMtlInst()
            {
                var mesh = await CEngine.Instance.MeshManager.CreateMeshAsync(CEngine.Instance.RenderContext, mMeshName);

                if (mesh == null)
                {
                    return;
                }
                HostMeshComp.SetSceneMesh(CEngine.Instance.RenderContext.ImmCommandList, mesh);
                HostMeshComp.OnPlacementChanged(HostMeshComp.Placement);
                ////////////////////临时用来 修正错误 mMtlList
                if (mMtlList != null && mesh.MtlMeshArray.Length == mMtlList.Count)
                {
                    bool validIndex = false;
                    for (int i = 0; i < mMtlList.Count; ++i)
                    {
                        for (int j = i; j < mMtlList.Count; ++j)
                        {
                            if (mMtlList[i].Index == mMtlList[j].Index)
                            {
                                validIndex = true;
                                break;
                            }
                        }
                    }
                    if (validIndex)
                    {
                        for (int i = 0; i < mMtlList.Count; ++i)
                        {
                            mMtlList[i].Index = (uint)i;
                        }
                    }
                    return;
                }
                ////////////////////临时用来 修正错误 mMtlList

                if (mMtlList != null && mesh.MtlMeshArray.Length == mMtlList.Count)
                {
                    return;
                }
                mMtlList = new List <MtlInst>();
                for (int i = 0; i < mesh.MtlMeshArray.Length; i++)
                {
                    var elem = new MtlInst();
                    elem.Index    = (UInt32)i;
                    elem.MeshComp = HostMeshComp;
                    //elem.Name = mesh.MaterialNames[i];
                    mMtlList.Add(elem);
                }
            }
Ejemplo n.º 4
0
        public void FillPassData(CRenderContext RHICtx,
                                 CPass refPass,
                                 CGfxEffect effect,
                                 PrebuildPassIndex ppi,
                                 bool flushVars = false)
        {
            refPass.Effect = effect;
            if (effect.CacheData.PerInstanceId != UInt32.MaxValue)
            {
                ReCreateCBuffer(RHICtx, effect, flushVars);
            }
            refPass.BindCBuffer(effect.ShaderProgram, effect.CacheData.PerInstanceId, CBuffer);
            MtlInst.BindTextures(refPass.ShaderResources, effect.ShaderProgram);
            refPass.BindShaderTextures(this);
            var tempSampler = new CShaderSamplers();

            this.GetSamplerBinder(RHICtx, effect.ShaderProgram, tempSampler);
            refPass.ShaderSamplerBinder = tempSampler;

            var PrebuildPassData = CEngine.Instance.PrebuildPassData;

            if (ppi == PrebuildPassIndex.PPI_HitProxy ||
                ppi == PrebuildPassIndex.PPI_SceneCapture)
            {
                switch (MtlInst.mRenderLayer)
                {
                case View.ERenderLayer.RL_Opaque:
                {
                    refPass.RenderPipeline.RasterizerState   = PrebuildPassData.mOpaqueRasterStat;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mOpaqueBlendStat;
                }
                break;

                case View.ERenderLayer.RL_Translucent:
                {
                    refPass.RenderPipeline.RasterizerState   = PrebuildPassData.mTranslucentRasterStat;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mTranslucentDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mOpaqueBlendStat;
                }
                break;

                case View.ERenderLayer.RL_CustomOpaque:
                case View.ERenderLayer.RL_CustomTranslucent:
                case View.ERenderLayer.RL_Gizmos:
                case View.ERenderLayer.RL_Sky:
                {
                    refPass.RenderPipeline.RasterizerState   = MtlInst.CustomRasterizerState;
                    refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mOpaqueBlendStat;
                }
                break;
                }
            }
            else if (ppi == PrebuildPassIndex.PPI_Snapshot)
            {
                switch (MtlInst.mRenderLayer)
                {
                case View.ERenderLayer.RL_Opaque:
                {
                    refPass.RenderPipeline.RasterizerState   = PrebuildPassData.mOpaqueRasterStat;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mOpaqueBlendStat;
                }
                break;

                case View.ERenderLayer.RL_Translucent:
                {
                    refPass.RenderPipeline.RasterizerState   = PrebuildPassData.mTranslucentRasterStat;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mTranslucentDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mSnapshotBlendStat;
                }
                break;

                case View.ERenderLayer.RL_CustomOpaque:
                case View.ERenderLayer.RL_CustomTranslucent:
                case View.ERenderLayer.RL_Gizmos:
                case View.ERenderLayer.RL_Sky:
                {
                    refPass.RenderPipeline.RasterizerState   = MtlInst.CustomRasterizerState;
                    refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mSnapshotBlendStat;
                }
                break;
                }
            }
            else if (ppi == PrebuildPassIndex.PPI_PickedEditor)
            {
                switch (MtlInst.mRenderLayer)
                {
                case View.ERenderLayer.RL_Opaque:
                {
                    refPass.RenderPipeline.RasterizerState   = PrebuildPassData.mOpaqueRasterStat;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mOpaqueBlendStat;
                }
                break;

                case View.ERenderLayer.RL_Translucent:
                {
                    refPass.RenderPipeline.RasterizerState   = PrebuildPassData.mTranslucentRasterStat;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mTranslucentDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mOpaqueBlendStat;
                }
                break;

                case View.ERenderLayer.RL_CustomOpaque:
                case View.ERenderLayer.RL_CustomTranslucent:
                case View.ERenderLayer.RL_Gizmos:
                case View.ERenderLayer.RL_Sky:
                {
                    refPass.RenderPipeline.RasterizerState   = MtlInst.CustomRasterizerState;
                    refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mOpaqueBlendStat;
                }
                break;
                }
            }
            else if (ppi == PrebuildPassIndex.PPI_SSM)
            {
                refPass.RenderPipeline.RasterizerState   = MtlInst.mShadowRasterState;
                refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat;
                refPass.RenderPipeline.BlendState        = PrebuildPassData.mShadowBlendStat;
            }
            else
            {
                switch (MtlInst.mRenderLayer)
                {
                case View.ERenderLayer.RL_Shadow:
                {
                    refPass.RenderPipeline.RasterizerState   = MtlInst.mShadowRasterState;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mShadowBlendStat;
                }
                break;

                case View.ERenderLayer.RL_Opaque:
                {
                    refPass.RenderPipeline.RasterizerState   = PrebuildPassData.mOpaqueRasterStat;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mOpaqueDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mOpaqueBlendStat;
                }
                break;

                case View.ERenderLayer.RL_Translucent:
                {
                    refPass.RenderPipeline.RasterizerState   = PrebuildPassData.mTranslucentRasterStat;
                    refPass.RenderPipeline.DepthStencilState = PrebuildPassData.mTranslucentDSStat;
                    refPass.RenderPipeline.BlendState        = PrebuildPassData.mTranslucentBlendStat;
                }
                break;

                case View.ERenderLayer.RL_CustomOpaque:
                case View.ERenderLayer.RL_CustomTranslucent:
                {
                    refPass.RenderPipeline.RasterizerState   = MtlInst.CustomRasterizerState;
                    refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState;
                    refPass.RenderPipeline.BlendState        = MtlInst.CustomBlendState; // PrebuildPassData.mOpaqueBlendStat;
                }
                break;

                case View.ERenderLayer.RL_Gizmos:
                case View.ERenderLayer.RL_Sky:
                {
                    refPass.RenderPipeline.RasterizerState   = MtlInst.CustomRasterizerState;
                    refPass.RenderPipeline.DepthStencilState = MtlInst.CustomDepthStencilState;
                    refPass.RenderPipeline.BlendState        = MtlInst.CustomBlendState;
                }
                break;
                }
            }
        }