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));
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #5
0
        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));
        }
Beispiel #6
0
        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));
        }
Beispiel #7
0
 public async System.Threading.Tasks.Task <bool> SetMaterial(CRenderContext rc, CGfxMaterialInstance mtl, string textureName)
 {
     return(await TextContext.SetMaterial(rc, mtl, textureName));
 }