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)); }
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); }
public async System.Threading.Tasks.Task <bool> SetMaterial(CRenderContext rc, CGfxMaterialInstance mtl, string textureName) { mMaterialInst = mtl; var senv = CEngine.Instance.PrebuildPassData.Font2DShadingEnvs; mEffects = new CGfxEffect[senv.Length]; for (int i = 0; i < mEffects.Length; i++) { if (senv[i] == null) { continue; } var desc = CGfxEffectDesc.CreateDesc(mMaterialInst.Material, new CGfxMdfQueue(), senv[i].EnvCode); var effect = CEngine.Instance.EffectManager.GetEffect(rc, desc); await effect.AwaitLoad(); mEffects[i] = effect; } var defEffect = mEffects[(int)PrebuildPassIndex.PPI_Default]; if (defEffect != null) { if (textureName != null) { mEffects[(int)PrebuildPassIndex.PPI_Default].ShaderProgram.FindTextureBindInfo(mMaterialInst, textureName, ref mTextureBindInfo); } else { mEffects[(int)PrebuildPassIndex.PPI_Default].ShaderProgram.GetTextureBindDesc(0, ref mTextureBindInfo); } return(true); } else { return(false); } }
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 async System.Threading.Tasks.Task <bool> InitForMultiPassMode(CRenderContext RHICtx, CGfxScreenViewDesc ViewInfo, List <CGfxShadingEnv> ShadingEnvArray, CGfxMaterialInstance MtlInst, CGfxMesh ViewportMesh) { if (ShadingEnvArray == null) { return(false); } if (ViewportMesh == null) { var RectMesh = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(RHICtx, CEngineDesc.FullScreenRectName, true); ViewportMesh = CEngine.Instance.MeshManager.CreateMesh(RHICtx, RectMesh); ViewportMesh.SetMaterialInstance(RHICtx, 0, await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(RHICtx, RName.GetRName("Material/defaultmaterial.instmtl")), CEngine.Instance.PrebuildPassData.DefaultShadingEnvs); //await ViewportMesh.AwaitEffects(); } mViewInfo = ViewInfo; mViewport = new CViewport(); mViewport.Width = ViewInfo.Width; mViewport.Height = ViewInfo.Height; mViewport.TopLeftX = 0.0f; mViewport.TopLeftY = 0.0f; mViewport.MinDepth = 0.0f; mViewport.MaxDepth = 1.0f; var ShaderProgram = CEngine.Instance.EffectManager.DefaultEffect.ShaderProgram; mScreenViewCB = RHICtx.CreateConstantBuffer(ShaderProgram, CEngine.Instance.EffectManager.DefaultEffect.CacheData.CBID_View); if (mScreenViewCB == null) { return(false); } mIDViewportSizeAndRcp = mScreenViewCB.FindVar("gViewportSizeAndRcp"); mID_SunPosNDC = mScreenViewCB.FindVar("gSunPosNDC"); mID_AoParam = mScreenViewCB.FindVar("gAoParam"); CRasterizerStateDesc RSDesc = new CRasterizerStateDesc(); RSDesc.InitForCustom(); mRasterState = CEngine.Instance.RasterizerStateManager.GetRasterizerState(RHICtx, RSDesc); CDepthStencilStateDesc DSSDesc = new CDepthStencilStateDesc(); DSSDesc.InitForCustomLayers(); mDepthStencilState = CEngine.Instance.DepthStencilStateManager.GetDepthStencilState(RHICtx, DSSDesc); CBlendStateDesc BlendDesc = new CBlendStateDesc(); BlendDesc.InitForCustomLayers(); mBlendState = CEngine.Instance.BlendStateManager.GetBlendState(RHICtx, BlendDesc); for (UInt32 idx = 0; idx < ShadingEnvArray.Count; idx++) { var refPass = RHICtx.CreatePass(); if (false == await refPass.InitPassForViewportView(RHICtx, ShadingEnvArray[(int)idx], MtlInst, ViewportMesh)) { return(false); } mPassArray.Add(refPass); } return(OnResize(RHICtx, null, ViewInfo.Width, ViewInfo.Height)); }
public async System.Threading.Tasks.Task <bool> Init(CRenderContext RHICtx, CSwapChain SwapChain, CGfxScreenViewDesc ViewInfo, CGfxShadingEnv ShadingEnv, CGfxMaterialInstance MtlInst, CGfxMesh ViewportMesh) { if (ShadingEnv == null) { return(false); } if (ViewportMesh == null) { var ScreenAlignedTriangle = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(RHICtx, CEngineDesc.ScreenAlignedTriangleName, true); ViewportMesh = CEngine.Instance.MeshManager.CreateMesh(RHICtx, ScreenAlignedTriangle); ViewportMesh.SetMaterialInstance(RHICtx, 0, await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(RHICtx, RName.GetRName("Material/defaultmaterial.instmtl")), CEngine.Instance.PrebuildPassData.DefaultShadingEnvs); //await ViewportMesh.AwaitEffects(); } mViewInfo = ViewInfo; mViewport = new CViewport(); mViewport.Width = ViewInfo.Width; mViewport.Height = ViewInfo.Height; mViewport.TopLeftX = 0.0f; mViewport.TopLeftY = 0.0f; mViewport.MinDepth = 0.0f; mViewport.MaxDepth = 1.0f; var ShaderProgram = CEngine.Instance.EffectManager.DefaultEffect.ShaderProgram; mScreenViewCB = RHICtx.CreateConstantBuffer(ShaderProgram, CEngine.Instance.EffectManager.DefaultEffect.CacheData.CBID_View); if (mScreenViewCB == null) { return(false); } mIDViewportSizeAndRcp = mScreenViewCB.FindVar("gViewportSizeAndRcp"); mID_SunPosNDC = mScreenViewCB.FindVar("gSunPosNDC"); mID_DirLightColor_Intensity = mScreenViewCB.FindVar("gDirLightColor_Intensity"); mID_AoParam = mScreenViewCB.FindVar("gAoParam"); CRasterizerStateDesc RSDesc = new CRasterizerStateDesc(); RSDesc.InitForCustom(); mRasterState = CEngine.Instance.RasterizerStateManager.GetRasterizerState(RHICtx, RSDesc); CDepthStencilStateDesc DSSDesc = new CDepthStencilStateDesc(); DSSDesc.InitForCustomLayers(); mDepthStencilState = CEngine.Instance.DepthStencilStateManager.GetDepthStencilState(RHICtx, DSSDesc); CBlendStateDesc BlendDesc = new CBlendStateDesc(); BlendDesc.InitForCustomLayers(); mBlendState = CEngine.Instance.BlendStateManager.GetBlendState(RHICtx, BlendDesc); mPass = RHICtx.CreatePass(); if (false == await mPass.InitPassForViewportView(RHICtx, ShadingEnv, MtlInst, ViewportMesh)) { return(false); } return(OnResize(RHICtx, SwapChain, ViewInfo.Width, ViewInfo.Height)); }
public async System.Threading.Tasks.Task <bool> SetMaterial(CRenderContext rc, CGfxMaterialInstance mtl, string textureName) { return(await TextContext.SetMaterial(rc, mtl, textureName)); }