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); } } }
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); } }
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); } }
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; } } }