Exemple #1
0
        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));
        }
Exemple #4
0
        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));
        }
Exemple #5
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);
        }
Exemple #6
0
        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));
        }
Exemple #7
0
 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);
        }
Exemple #11
0
        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);
        }
Exemple #12
0
 public MeshVars(CGfxMesh This)
 {
     mHost = This;
 }
Exemple #13
0
 public virtual void TickSync(CRenderContext rc, CGfxMesh mesh, Int64 time)
 {
     SDK_GfxModifier_TickSync(CoreObject, rc.CoreObject, mesh.CoreObject, time);
 }