public async System.Threading.Tasks.Task <bool> InitPassForViewportView(CRenderContext RHICtx, Graphics.CGfxShadingEnv shadingEnv, Graphics.CGfxMaterialInstance MtlInst, Graphics.Mesh.CGfxMesh ViewportMesh) { var effect = GetEffect(RHICtx, shadingEnv.EnvCode, MtlInst, ViewportMesh); if (effect == null) { return(false); } await effect.AwaitLoad(); if (effect.ShaderProgram == null) { return(false); } this.ShadingEnv = shadingEnv; this.Effect = effect; this.mMtlInst = MtlInst; this.MtlMesh = ViewportMesh.MtlMeshArray[0]; if (mRenderPipeline == null) { var RplDesc = new CRenderPipelineDesc(); RenderPipeline = RHICtx.CreateRenderPipeline(RplDesc); } BindCBuffer(effect.ShaderProgram, effect.CacheData.PerInstanceId, ViewportMesh.MtlMeshArray[0].CBuffer); BindCBuffer(effect.ShaderProgram, effect.CacheData.PerFrameId, CEngine.Instance.PerFrameCBuffer); this.BindGeometry(ViewportMesh.MeshPrimitives, 0, 0); PreUse(); return(true); }
public CGfxEffect TryGetEffect(CRenderContext RHICtx, CGfxMesh mesh, bool tryLoad, GfxEnvShaderCode ShaderEnv) { var result = CGfxEffectDesc.CreateDesc(MtlInst.Material, mesh.MdfQueue, ShaderEnv);//, mShaderDefinition); var hash64 = result.GetHash64(); return(CEngine.Instance.EffectManager.TryGetEffect(ref hash64)); }
public bool Init(CRenderContext RHICtx, CGfxMesh SceneMesh, UInt32 index, CGfxMaterialInstance mtl_inst, CGfxShadingEnv[] EnvShaderArray, bool preUseEffect) { if (EnvShaderArray == null) { EnvShaderArray = CEngine.Instance.PrebuildPassData.DefaultShadingEnvs; } MtlInst = mtl_inst; mRootSceneMesh = SceneMesh; mAtomIndex = index; CGfxEffect[] effects = new CGfxEffect[EnvShaderArray.Length]; for (int ppi = 0; ppi < (int)PrebuildPassIndex.PPI_Num; ppi++) { if (EnvShaderArray[ppi] == null) { continue; } var effect = GetEffectAsync(RHICtx, SceneMesh, true, EnvShaderArray[ppi].EnvCode); effects[ppi] = effect; } return(InitByEffects(RHICtx, SceneMesh, index, mtl_inst, effects, EnvShaderArray, preUseEffect)); }
private Graphics.CGfxEffect GetEffect(CRenderContext RHICtx, Graphics.GfxEnvShaderCode ShaderEnv, Graphics.CGfxMaterialInstance mtl, Graphics.Mesh.CGfxMesh mesh) { var desc = Graphics.CGfxEffectDesc.CreateDesc(mtl.Material, mesh.MdfQueue, ShaderEnv); return(CEngine.Instance.EffectManager.GetEffect(RHICtx, desc)); }
public bool Init(CRenderContext rc, CGfxMesh mesh, CGfxMaterialInstance material) { Material = material; mEffect = GetEffect(rc, mesh, true); if (mEffect == null) { return(false); } UpdateMaterialCBuffer(rc, true); return(true); }
private CGfxEffect GetEffect(CRenderContext rc, CGfxMesh mesh, bool tryLoad) { CGfxEffectDesc desc = new CGfxEffectDesc(); desc.Material = Material.Material; desc.ShadingEnv = mesh.ShadingEnv; desc.MdfQueue = mesh.MdfQueue; desc.Definitions = ShaderDefinition; desc.UpdateDefinitions(); return(CEngine.Instance.EffectManager.GetEffect(rc, desc, tryLoad)); }
public void TickLogic(CRenderContext rc, CGfxMesh mesh, Int64 time) { ScopeTick.Begin(); //SDK_GfxMdfQueue_TickLogic(CoreObject, rc.CoreObject, mesh.CoreObject); for (int i = 0; i < Modifiers.Count; i++) { var scope = Modifiers[i].GetTickTimeLogicScope(); if (scope != null) { scope.Begin(); } Modifiers[i].TickLogic(rc, mesh, time); if (scope != null) { scope.End(); } } ScopeTick.End(); }
public CGfxEffect GetEffectAsync(CRenderContext RHICtx, CGfxMesh mesh, bool tryLoad, GfxEnvShaderCode ShaderEnv) { var mEffectDesc = GetEffectDesc(mesh, ShaderEnv); return(CEngine.Instance.EffectManager.GetEffect(RHICtx, mEffectDesc)); }
internal CGfxEffectDesc GetEffectDesc(CGfxMesh mesh, GfxEnvShaderCode ShaderEnv) { var result = CGfxEffectDesc.CreateDesc(MtlInst.Material, mesh.MdfQueue, ShaderEnv);//, mShaderDefinition); return(result); }
public bool InitByEffects(CRenderContext RHICtx, CGfxMesh SceneMesh, UInt32 index, CGfxMaterialInstance mtl_inst, CGfxEffect[] effects, CGfxShadingEnv[] EnvShaderArray, bool preUseEffect) { MtlInst = mtl_inst; mRootSceneMesh = SceneMesh; mAtomIndex = index; if (mPrebuildPassArray == null) { mPrebuildPassArray = new CPass[(int)PrebuildPassIndex.PPI_Num]; } for (int ppi = 0; ppi < (int)PrebuildPassIndex.PPI_Num; ppi++) { var effect = effects[ppi]; if (effect == null) { continue; } CPass refPass = null; if (mPrebuildPassArray[ppi] != null) { refPass = mPrebuildPassArray[ppi]; } else { refPass = RHICtx.CreatePass(); } refPass.InitPass(RHICtx, effect, EnvShaderArray[ppi], this, index); refPass.PassIndex = (PrebuildPassIndex)ppi; //如果Effect已经加载完成,那么设置Pass状态 //否则就要等渲染的时候Pass.PreUse来间接触发了 // if (refPass.Effect.IsValid) { FillPassData(RHICtx, refPass, effect, (PrebuildPassIndex)ppi, true); } else { if (preUseEffect) { effect.PreUse((successed) => { if (successed == false) { return; } FillPassData(RHICtx, refPass, effect, (PrebuildPassIndex)ppi); }); } } //这里一旦PreUse了,那就把所有shader都在初始化的时候就加载了 //effect.PreUse((successed) => //{ // if(successed==false) // { // return; // } // FillPassData(RHICtx, refPass, effect, (PrebuildPassIndex)ppi); //}); mPrebuildPassArray[ppi] = refPass; } return(true); }
public void SetPassData(CRenderContext rc, CGfxMesh mesh, UInt32 index, CGfxSceneView vp, CPass pass) { //OnEffectRefresh(rc); if (pass.RenderPipeline == null) { var rplDesc = new CRenderPipelineDesc(); pass.RenderPipeline = rc.CreateRenderPipeline(rplDesc); } pass.RenderPipeline.ShaderProgram = mEffect.ShaderProgram; pass.RenderPipeline.RasterizerState = mMaterial.RasterizerState; pass.RenderPipeline.DepthStencilState = mMaterial.DepthStencilState; pass.RenderPipeline.BlendState = mMaterial.BlendState; pass.GeometryMesh = mesh.MeshPrimitives.GeometryMesh; pass.BindCBuffer(mEffect.ShaderProgram, mEffect.PerInstanceId, CBuffer); pass.BindCBuffer(mEffect.ShaderProgram, mEffect.PerFrameId, CEngine.Instance.PerFrameCBuffer); if (vp != null) { pass.ViewPort = vp.Viewport; } var textures = new CShaderResources(); { Material.BindTextures(textures, mEffect.ShaderProgram); foreach (var i in Textures) { textures.PSBindTexture(i.Key, i.Value); } mesh.ShadingEnv.BindResources(mesh, CBuffer, textures, mEffect.ShaderProgram); } pass.ShaderResources = textures; CShaderSamplers samplers = new CShaderSamplers(); { CSamplerStateDesc sampDesc = new CSamplerStateDesc(); sampDesc.SetDefault(); sampDesc.Filter = ESamplerFilter.SPF_MIN_MAG_MIP_POINT; CSamplerState samp = CEngine.Instance.SamplerStateManager.GetSamplerState(rc, sampDesc); for (UInt32 i = 0; i < mEffect.ShaderProgram.SamplerNumber; i++) { CSamplerBindInfo info = new CSamplerBindInfo(); mEffect.ShaderProgram.GetSamplerBindInfo(i, ref info); samplers.PSBindSampler(info.PSBindPoint, samp); } } pass.ShaderSamplers = samplers; foreach (var i in mesh.MdfQueue.Modifiers) { i.OnSetPassData(pass); } CDrawPrimitiveDesc dpDesc = new CDrawPrimitiveDesc(); mesh.MeshPrimitives.GetAtom(index, 0, ref dpDesc); pass.BindDrawPrimitive(ref dpDesc); }
public MeshVars(CGfxMesh This) { mHost = This; }
public virtual void TickSync(CRenderContext rc, CGfxMesh mesh, Int64 time) { SDK_GfxModifier_TickSync(CoreObject, rc.CoreObject, mesh.CoreObject, time); }