示例#1
0
        public async System.Threading.Tasks.Task <bool> Init(CRenderContext rc, CSwapChain SwapChain,
                                                             View.CGfxScreenViewDesc ViewInfo, CGfxShadingEnv ShadingEnv, RName MtlInst, string debugName)
        {
            mCmdList = new CCommandList[2];

            EngineNS.CCommandListDesc CmdListDesc = new EngineNS.CCommandListDesc();
            mCmdList[0]           = rc.CreateCommandList(CmdListDesc);
            mCmdList[1]           = rc.CreateCommandList(CmdListDesc);
            mCmdList[0].DebugName = debugName;
            mCmdList[1].DebugName = debugName;

            var ScreenAlignedTriangle = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(rc, CEngineDesc.ScreenAlignedTriangleName, true);

            mScreenAlignedTriangle = CEngine.Instance.MeshManager.CreateMesh(rc, ScreenAlignedTriangle);
            var mtl = await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(rc, MtlInst);

            mScreenAlignedTriangle.SetMaterialInstance(rc, 0,
                                                       mtl,
                                                       CEngine.Instance.PrebuildPassData.DefaultShadingEnvs);
            //await mScreenAlignedTriangle.AwaitEffects();

            mShadingEnv = ShadingEnv;
            mScreenView = new View.CGfxScreenView();
            return(await mScreenView.Init(rc, SwapChain, ViewInfo, ShadingEnv, mtl, mScreenAlignedTriangle));
        }
示例#2
0
        public void CookViewportMeshToPass(CRenderContext RHICtx, CGfxShadingEnv ShaderEnv, CGfxCamera Camera, CGfxMesh ViewportMesh)
        {
            if (ViewportMesh == null)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"ViewportViewError!!!", "");
                System.Diagnostics.Debug.Assert(false);
                return;
            }
            if (mPass == null)
            {
                System.Diagnostics.Debug.Assert(false);
                return;
            }

            ViewportMesh.MeshPrimitives.PreUse(false);

            var refMtlMesh = ViewportMesh.MtlMeshArray[0];

            if (refMtlMesh == null)
            {
                return;
            }

            mPass.RenderPipeline.RasterizerState   = mRasterState;
            mPass.RenderPipeline.DepthStencilState = mDepthStencilState;
            mPass.RenderPipeline.BlendState        = mBlendState;

            mPass.BindShaderTextures(refMtlMesh);

            //if(mPass.ShaderSamplerBinder==null)
            //{
            //    mPass.ShaderSamplerBinder = new CShaderSamplers();
            //}
            //refMtlMesh.GetSamplerBinder(RHICtx, mPass.Effect.ShaderProgram, mPass.ShaderSamplerBinder);
            //var tempSampler = new CShaderSamplers();
            var tempSampler = mCookVPMeshSampler;

            refMtlMesh.GetSamplerBinder(RHICtx, mPass.Effect.ShaderProgram, tempSampler);
            mPass.ShaderSamplerBinder = tempSampler;

            ShaderEnv.BindResources(ViewportMesh, mPass);

            mPass.BindGeometry(ViewportMesh.MeshPrimitives, 0, 0);

            mPass.ViewPort = mViewport;

            mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_Camera, Camera.CBuffer);
            mPass.BindCBuffer(mPass.Effect.ShaderProgram, mPass.Effect.CacheData.CBID_View, mScreenViewCB);

            mPass.OnCookRenderData(ShaderEnv, PrebuildPassIndex.PPI_Default);
            return;
        }
示例#3
0
        public void CookViewportMeshToPassInMultiPassMode(CRenderContext RHICtx, CGfxShadingEnv ShaderEnv, UInt32 ActivePassIndex, CGfxCamera Camera, CGfxMesh ViewportMesh)
        {
            if (ViewportMesh == null)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"ViewportViewError!!!", "");
                System.Diagnostics.Debug.Assert(false);
                return;
            }

            if (ActivePassIndex > mPassArray.Count - 1)
            {
                System.Diagnostics.Debug.Assert(false);
                return;
            }

            ViewportMesh.MeshPrimitives.PreUse(false);

            var refMtlMesh = ViewportMesh.MtlMeshArray[0];

            if (refMtlMesh == null)
            {
                System.Diagnostics.Debug.Assert(false);
                return;
            }

            mPassArray[(int)ActivePassIndex].RenderPipeline.RasterizerState   = mRasterState;
            mPassArray[(int)ActivePassIndex].RenderPipeline.DepthStencilState = mDepthStencilState;
            mPassArray[(int)ActivePassIndex].RenderPipeline.BlendState        = mBlendState;

            mPassArray[(int)ActivePassIndex].BindShaderTextures(refMtlMesh);

            refMtlMesh.GetSamplerBinder(RHICtx, mPassArray[(int)ActivePassIndex].Effect.ShaderProgram, mSampler4Cook);
            mPassArray[(int)ActivePassIndex].ShaderSamplerBinder = mSampler4Cook;

            ShaderEnv.BindResources(ViewportMesh, mPassArray[(int)ActivePassIndex]);

            mPassArray[(int)ActivePassIndex].BindGeometry(ViewportMesh.MeshPrimitives, 0, 0);

            mPassArray[(int)ActivePassIndex].ViewPort = mViewport;

            mPassArray[(int)ActivePassIndex].BindCBuffer(mPassArray[(int)ActivePassIndex].Effect.ShaderProgram, mPassArray[(int)ActivePassIndex].Effect.CacheData.CBID_Camera, Camera.CBuffer);
            mPassArray[(int)ActivePassIndex].BindCBuffer(mPassArray[(int)ActivePassIndex].Effect.ShaderProgram, mPassArray[(int)ActivePassIndex].Effect.CacheData.CBID_View, mScreenViewCB);

            return;
        }
示例#4
0
        public async System.Threading.Tasks.Task <bool> Init2(CRenderContext rc, CGfxShadingEnv ShadingEnv, RName MtlInst, View.CGfxScreenView view)
        {
            mCmdList = new CCommandList[2];

            EngineNS.CCommandListDesc CmdListDesc = new EngineNS.CCommandListDesc();
            mCmdList[0] = rc.CreateCommandList(CmdListDesc);
            mCmdList[1] = rc.CreateCommandList(CmdListDesc);

            var ScreenAlignedTriangle = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(rc, CEngineDesc.ScreenAlignedTriangleName, true);

            mScreenAlignedTriangle = CEngine.Instance.MeshManager.CreateMesh(rc, ScreenAlignedTriangle);
            var mtl = await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(rc, MtlInst);

            mScreenAlignedTriangle.SetMaterialInstance(rc, 0,
                                                       mtl,
                                                       CEngine.Instance.PrebuildPassData.DefaultShadingEnvs);

            mShadingEnv = ShadingEnv;
            mScreenView = view;
            return(true);
        }
示例#5
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));
        }
示例#6
0
        public void SetRLayerParameter(View.ERenderLayer layer, PrebuildPassIndex passIndex, CGfxShadingEnv shadingEnv)
        {
            RLayerParameter parameter;

            if (mLayerParameter.TryGetValue(layer, out parameter) == false)
            {
                parameter = new RLayerParameter();
                mLayerParameter.Add(layer, parameter);
            }
            parameter.Layer      = layer;
            parameter.PassIndex  = passIndex;
            parameter.ShadingEnv = shadingEnv;
        }
示例#7
0
        public void CookShadowLayerData2Pass(CRenderContext RHICtx, CGfxCamera ViewerCamera, CGfxCamera ShadowCamera, CGfxShadingEnv ShadingEnv)
        {
            if (ViewerCamera == null || ShadowCamera == null || RHICtx == null || ShadingEnv == null)
            {
                return;
            }

            var ShadowRenderLayer = ViewerCamera.mSceneRenderLayer[(int)ERenderLayer.RL_Shadow];
            int Count             = ShadowRenderLayer.GetRenderLayerAtomNum();

            for (uint idx = 0; idx < Count; idx++)
            {
                var MtlMesh = ShadowRenderLayer.GetMtlMeshFromArray(idx);
                if (MtlMesh == null)
                {
                    return;
                }
                var SceneMesh = MtlMesh.mRootSceneMesh;

                if (MtlMesh == null || SceneMesh == null)
                {
                    Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"NullPtr here", "");
                    continue;
                }

                MtlMesh.UpdatePerMtlMeshCBufferForShadow(RHICtx, ShadowCamera);

                CPass refPass = MtlMesh.GetPass(PrebuildPassIndex.PPI_SSM);
                if (refPass == null)
                {
                    continue;
                }
                if (refPass.PreUse() == false)
                {
                    continue;
                }
                refPass.BindShaderTextures(MtlMesh);

                refPass.ShaderSamplerBinder = MtlMesh.GetSamplerBinder_Shadow(RHICtx, refPass.Effect.ShaderProgram);
                ShadingEnv.BindResources(SceneMesh, refPass);

                refPass.ViewPort = mViewport;
                refPass.BindCBuffer(refPass.Effect.ShaderProgram, refPass.Effect.CacheData.CBID_Camera, ShadowCamera.CBuffer);
                refPass.BindCBuffer(refPass.Effect.ShaderProgram, refPass.Effect.CacheData.CBID_View, SceneViewCB);

                SceneMesh.MdfQueue.OnSetPassData(refPass, true);

                SendPassToCorrectRenderLayer(ERenderLayer.RL_Shadow, refPass);
            }
        }
示例#8
0
        public void CookSpecRenderLayerDataToPass(CRenderContext RHICtx, ERenderLayer RenderLayer, CGfxCamera ViewerCamera, CGfxShadingEnv ShadingEnv, PrebuildPassIndex ppi)
        {
            ScopeCook2Pass.Begin();
            if (ViewerCamera == null || RenderLayer == ERenderLayer.RL_Shadow)
            {
                return;
            }

            if (RenderLayer == ERenderLayer.RL_Num)
            {
                RenderLayer = ERenderLayer.RL_Num - 1;
                return;
            }

            var SpecRenderLayer = ViewerCamera.mSceneRenderLayer[(int)RenderLayer];
            int Count           = SpecRenderLayer.GetRenderLayerAtomNum();

            for (uint idx = 0; idx < Count; idx++)
            {
                var MtlMesh = SpecRenderLayer.GetMtlMeshFromArray(idx);
                if (MtlMesh == null)
                {
                    break;
                }
                var SceneMesh = MtlMesh.mRootSceneMesh;

                if (MtlMesh == null || SceneMesh == null)
                {
                    Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"NullPtr here", "");
                    continue;
                }

                if (ppi == PrebuildPassIndex.PPI_HitProxy && SceneMesh.mMeshVars.mHitProxyId == 0)
                {
                    continue;
                }

                if (ppi == PrebuildPassIndex.PPI_PickedEditor)
                {
                    if (SceneMesh.mSelected == false)
                    {
                        continue;
                    }
                }

                MtlMesh.UpdatePerMtlMeshCBuffer(RHICtx, ViewerCamera);

                CPass refPass = MtlMesh.GetPass(ppi);
                if (refPass == null)
                {
                    continue;
                }
                if (false == refPass.PreUse())
                {
                    continue;
                }

                refPass.OnCookRenderData(ShadingEnv, ppi);

                switch (ppi)
                {
                case PrebuildPassIndex.PPI_PickedEditor:
                    refPass.BindShaderTextures(MtlMesh);
                    refPass.ShaderSamplerBinder = MtlMesh.GetSamplerBinder_PickedEditor(RHICtx, refPass.Effect.ShaderProgram);
                    ShadingEnv.BindResources(SceneMesh, refPass);
                    break;

                case PrebuildPassIndex.PPI_HitProxy:
                {
                    refPass.BindShaderTextures(MtlMesh);
                    refPass.ShaderSamplerBinder = MtlMesh.GetSamplerBinder_HitProxy(RHICtx, refPass.Effect.ShaderProgram);
                    ShadingEnv.BindResources(SceneMesh, refPass);
                }
                break;

                case PrebuildPassIndex.PPI_SceneCapture:
                case PrebuildPassIndex.PPI_OpaquePbr:
                case PrebuildPassIndex.PPI_TransparentPbr:
                case PrebuildPassIndex.PPI_CustomTranslucentPbr:
                case PrebuildPassIndex.PPI_OpaquePbrEditor:
                case PrebuildPassIndex.PPI_CustomTranslucentPbrEditor:
                case PrebuildPassIndex.PPI_Gizmos:
                case PrebuildPassIndex.PPI_Snapshot:
                case PrebuildPassIndex.PPI_Sky:
                {
                    refPass.BindShaderTextures(MtlMesh);
                    //refPass.ShaderSamplerBinder = MtlMesh.GetSamplerBinder(RHICtx, refPass.Effect.ShaderProgram);
                    ShadingEnv.BindResources(SceneMesh, refPass);
                    //var sEnv = refPass.Effect.Desc.EnvShaderPatch;
                    //sEnv.BindResources(SceneMesh, refPass);
                }
                break;

                default:
                    break;
                }

                refPass.ViewPort = Viewport;
#if DEBUG
                if (ViewerCamera.CBuffer == null)
                {
                    System.Diagnostics.Debug.Assert(false);
                }
#endif
                refPass.BindCBuffer(refPass.Effect.ShaderProgram, refPass.Effect.CacheData.CBID_Camera, ViewerCamera.CBuffer);

                refPass.BindCBuffer(refPass.Effect.ShaderProgram, refPass.Effect.CacheData.CBID_View, SceneViewCB);

                SceneMesh.MdfQueue.OnSetPassData(refPass, false);

                SendPassToCorrectRenderLayer(RenderLayer, refPass);
            }

            ScopeCook2Pass.End();
        }