private void PassData2ConstBufferPerTickForShadow(CGfxCamera camera)
 {
     if (CBuffer == null)
     {
         return;
     }
 }
        public void UpdatePerMtlMeshCBufferForShadow(CRenderContext RHICtx, CGfxCamera camera)
        {
            var refPrebuildPass = GetFirstValidPass();

            if (refPrebuildPass == null || refPrebuildPass.Effect == null)
            {
                return;
            }

            var cbIndex = refPrebuildPass.Effect.CacheData.PerInstanceId;// effect.ShaderProgram.FindCBuffer("cbPerInstance");

            if ((int)cbIndex >= 0)
            {
                //else
                //{
                //    //this code below is for what????????
                //    var cbDesc = new CConstantBufferDesc();
                //    if (refPrebuildPass.Effect.ShaderProgram.GetCBufferDesc(cbIndex, ref cbDesc))
                //    {
                //        if (mCBuffer.Size != cbDesc.Size)
                //        {
                //            Profiler.Log.WriteLine(Profiler.ELogTag.Warning, "Material", $"{refPrebuildPass.Effect.Desc.MtlShaderPatch.Name} CBuffer size is invalid, recreate it");
                //            mCBuffer?.Cleanup();
                //            mCBuffer = RHICtx.CreateConstantBuffer(refPrebuildPass.Effect.ShaderProgram, cbIndex);
                //            MeshVarVersion = UInt32.MaxValue;
                //        }
                //    }
                //}

                PassData2ConstBufferPerTickForShadow(camera);

                //MtlInst.SetCBufferVars(mCBuffer);
            }
        }
Exemple #3
0
        public void OnCheckVisible(CCommandList cmd, GSceneGraph scene, CGfxCamera camera, CheckVisibleParam param)
        {
            if (HostSet == null)
            {
                throw new InvalidOperationException("");
            }
            var bitSet = HostSet.PvsData[PvsIndex];

            if (scene.PVSActors != null && scene.PVSActors.Length == bitSet.BitCount)
            {
                for (int i = 0; i < bitSet.BitCount; i++)
                {
                    if (!bitSet.IsBit(i))
                    {
                        continue;
                    }

                    Actor.GActor actor = scene.PVSActors[i];
                    if (actor.NeedCheckVisible(param) == false)
                    {
                        continue;
                    }
                    if (param.FrustumCulling && actor.CheckContain(camera.CullingFrustum, true) == CGfxCamera.CFrustum.CONTAIN_TYPE.CONTAIN_TEST_OUTER)
                    {
                        continue;
                    }

                    actor.OnCheckVisible(cmd, scene, camera, param);
                }
            }
        }
Exemple #4
0
        public void TickLogic(CGfxCamera Camera, View.CGfxSceneView view, CRenderContext RHICtx)
        {
            var CmdList = CommitingCMDs;

            if (mScreenAlignedTriangle != null)
            {
                mScreenView.CookViewportMeshToPass(RHICtx, mShadingEnv, Camera, mScreenAlignedTriangle);
                mScreenView.PushPassToRHI(CmdList);
            }
        }
Exemple #5
0
 public override void CommitVisual(CCommandList cmd, CGfxCamera camera, CheckVisibleParam param)
 {
     if (CIPlatform.Instance.PlayMode == CIPlatform.enPlayMode.Editor)
     {
         var showMesh = Host.FindComponentBySpecialName("SphereVolumeShow") as GMeshComponent;
         if (showMesh != null)
         {
             showMesh.Visible = CEngine.ShowLightAssist;
         }
     }
     base.CommitVisual(cmd, camera, param);
 }
Exemple #6
0
 public void SetWorldMatrix(ref Matrix worldMatrix, CGfxCamera camera)
 {
     if (mCBuffer == null)
     {
         return;
     }
     mCBuffer.SetValue(mWorldMatrixId, worldMatrix, 0);
     if (camera != null)
     {
         var mvp = worldMatrix * camera.ViewProjection;
         mCBuffer.SetValue(mWorldViewProjectionMatrixId, mvp, 0);
     }
 }
Exemple #7
0
        public void Cleanup()
        {
            mCmdListDB_Shadow[0].Cleanup();
            mCmdListDB_Shadow[0] = null;
            mCmdListDB_Shadow[1].Cleanup();
            mCmdListDB_Shadow[1] = null;

            mShadowMapView.Cleanup();
            mShadowMapView = null;

            mShadowCamera.Cleanup();
            mShadowCamera = null;
        }
Exemple #8
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);
            }
        }
        public override void OnEditorCommitVisual(CCommandList cmd, CGfxCamera camera, CheckVisibleParam param)
        {
            if (ShowEditorVisual == false)
            {
                return;
            }
            var scene = this.Host.Scene;

            for (int i = 0; i < Elements.Count; i++)
            {
                Elements[i].ShowActor?.Actor.OnCheckVisible(cmd, scene, camera, param);
            }
            base.OnEditorCommitVisual(cmd, camera, param);
        }
        private void PassData2ConstBufferPerTick(CGfxCamera camera)
        {
            if (CBuffer == null)
            {
                return;
            }

            if (MeshVarVersion != mRootSceneMesh.mMeshVars.Version)
            {
                //mCBuffer.SetValue(mID_ActorId, mRootSceneMesh.mMeshVars.ActorIdColor, 0);
                //mCBuffer.SetValue(mID_HitProxyId, mRootSceneMesh.mMeshVars.HitProxyColor, 0);

                MeshVarVersion = mRootSceneMesh.mMeshVars.Version;
            }
        }
Exemple #11
0
        public void TickLogic(CRenderContext RHICtx, CGfxCamera camera, Vector3 SunDir, CGfxSceneView BaseSceneView)
        {
            TickLogic_Impl(RHICtx, camera, SunDir, BaseSceneView);

            mSunPosNdc.Z = 0.25f * mSunShaftAtten;
            if (mStopSunShaftUpdate == true)
            {
                //disable sun shaft;
                mSunPosNdc.W = 0.0f;
            }
            else
            {
                mSunPosNdc.W = 1.0f;
            }
        }
        public void UpdatePerMtlMeshCBuffer(CRenderContext RHICtx, CGfxCamera camera)
        {
            var refPrebuildPass = GetFirstValidPass();

            if (refPrebuildPass == null || refPrebuildPass.Effect == null)
            {
                return;
            }

            //ScopeUpdateCBuffer.Begin();
            var cbIndex = refPrebuildPass.Effect.CacheData.PerInstanceId;// effect.ShaderProgram.FindCBuffer("cbPerInstance");

            if ((int)cbIndex >= 0)
            {
                PassData2ConstBufferPerTick(camera);
                //MtlInst.SetCBufferVars(mCBuffer);
            }
            //ScopeUpdateCBuffer.End();
        }
Exemple #13
0
        public bool Init(CRenderContext rc, bool autoFlush)
        {
            mCamera          = new CGfxCamera();
            Camera.DebugName = "GCameraComponent";
            if (!Camera.Init(rc, autoFlush))
            {
                return(false);
            }
            PerspectiveFovLH();
            var eye = new EngineNS.Vector3();

            eye.SetValue(0.0f, 0.0f, -3.6f);
            var at = new EngineNS.Vector3();

            at.SetValue(0.0f, 0.0f, 0.0f);
            var up = new EngineNS.Vector3();

            up.SetValue(0.0f, 1.0f, 0.0f);
            Camera.LookAtLH(eye, at, up);
            return(true);
        }
Exemple #14
0
        public CPass TickLogic(CGfxCamera Camera, View.CGfxSceneView view, CRenderContext rc, int DPLimitter, bool GraphicsDebug)
        {
            var CmdList = CommitingCMDs;

            if (CmdList == null)
            {
                return(null);
            }
            using (var i = mLayerParameter.GetEnumerator())
            {
                while (i.MoveNext())
                {
                    var parameter = i.Current.Value;
                    mBaseSceneView.CookSpecRenderLayerDataToPass(rc, parameter.Layer, Camera, parameter.ShadingEnv, parameter.PassIndex);
                    mBaseSceneView.PushSpecRenderLayerDataToRHI(CmdList, parameter.Layer);
                }
            }

            CmdList.BeginCommand();
            CmdList.BeginRenderPass(mRenderPassDesc, mBaseSceneView.FrameBuffer);

            if (BeforeBuildRenderPass != null)
            {
                BeforeBuildRenderPass(Camera, view, rc, CmdList, DPLimitter, GraphicsDebug);
            }

            var LatestPass = CmdList.BuildRenderPass(DPLimitter, GraphicsDebug);

            if (AfterBuildRenderPass != null)
            {
                AfterBuildRenderPass(Camera, view, rc, CmdList, DPLimitter, GraphicsDebug);
            }

            CmdList.EndRenderPass();
            CmdList.EndCommand();

            return(LatestPass);
        }
        public override async System.Threading.Tasks.Task <bool> Init(CRenderContext RHICtx, UInt32 width, UInt32 height, CGfxCamera camera, IntPtr WinHandle)
        {
            if (mOpaqueSE == null)
            {
                mOpaqueSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileOpaqueSE>();
            }

            if (mCustomTranslucentSE == null)
            {
                mCustomTranslucentSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileCustomTranslucentSE>();
            }

            if (mTranslucentSE == null)
            {
                mTranslucentSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileTranslucentSE>();
            }

            if (mCopySE == null)
            {
                mCopySE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileCopySE>();
            }

            if (mGizmosSE == null)
            {
                mGizmosSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxGizmosSE>();
            }

            if (mSE_MobileSky == null)
            {
                mSE_MobileSky = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxSE_MobileSky>();
            }

            if (mOpaqueSE == null || mCustomTranslucentSE == null || mTranslucentSE == null || mCopySE == null || mGizmosSE == null || mSE_MobileSky == null)
            {
                return(false);
            }

            {
                //base scene view;
                CGfxSceneViewInfo BaseViewInfo = new CGfxSceneViewInfo();
                BaseViewInfo.mUseDSV = true;
                BaseViewInfo.Width   = width;
                BaseViewInfo.Height  = height;
                BaseViewInfo.mDSVDesc.Init();
                BaseViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D24_UNORM_S8_UINT;
                BaseViewInfo.mDSVDesc.Width  = width;
                BaseViewInfo.mDSVDesc.Height = height;

                CRenderTargetViewDesc rtDesc0 = new CRenderTargetViewDesc();
                rtDesc0.Init();
                //rtDesc0.Format = EPixelFormat.PXF_R8G8B8A8_UNORM;
                rtDesc0.Format = EPixelFormat.PXF_R16G16B16A16_FLOAT;
                rtDesc0.Width  = width;
                rtDesc0.Height = height;
                BaseViewInfo.mRTVDescArray.Add(rtDesc0);

                BaseSceneView = new CGfxSceneView();
                if (false == BaseSceneView.Init(RHICtx, null, BaseViewInfo))
                {
                    return(false);
                }
                BaseSceneView.UIHost = new UISystem.UIHost();
                await BaseSceneView.UIHost.Initialize(RHICtx, new UISystem.UIHostInitializer());

                BaseSceneView.UIHost.WindowSize = new SizeF(width, height);

                mForwardBasePass = new CGfxFramePass(RHICtx, "OffSrcFWBasePass");
                mForwardBasePass.mBaseSceneView = BaseSceneView;

                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Opaque, PrebuildPassIndex.PPI_OpaquePbr, mOpaqueSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_CustomOpaque, PrebuildPassIndex.PPI_OpaquePbr, mOpaqueSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Sky, PrebuildPassIndex.PPI_Sky, mSE_MobileSky);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_CustomTranslucent, PrebuildPassIndex.PPI_CustomTranslucentPbr, mCustomTranslucentSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Translucent, PrebuildPassIndex.PPI_Gizmos, mTranslucentSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Gizmos, PrebuildPassIndex.PPI_TransparentPbr, mGizmosSE);

                FrameBufferClearColor TempClearColor = new FrameBufferClearColor();
                TempClearColor.r = 0.0f;
                TempClearColor.g = 0.0f;
                TempClearColor.b = 0.0f;
                TempClearColor.a = 0.0f;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mFBClearColorRT0       = TempClearColor;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mDepthClearValue       = 1.0f;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mStencilClearValue     = 0u;
            }

            {
                //ufo scene view;
                CGfxScreenViewDesc UFOViewInfo = new CGfxScreenViewDesc();
                UFOViewInfo.IsSwapChainBuffer   = false;
                UFOViewInfo.UseDepthStencilView = false;
                UFOViewInfo.Width  = width;
                UFOViewInfo.Height = height;

                var rtDesc1 = new CRenderTargetViewDesc();
                rtDesc1.Init();
                rtDesc1.mCanBeSampled = vBOOL.FromBoolean(true);
                rtDesc1.Format        = EPixelFormat.PXF_R8G8B8A8_UNORM;
                rtDesc1.Width         = width;
                rtDesc1.Height        = height;
                UFOViewInfo.mRTVDescArray.Add(rtDesc1);

                mCopyPostprocessPass = new CGfxPostprocessPass();
                await mCopyPostprocessPass.Init(RHICtx, SwapChain, UFOViewInfo, mCopySE, RName.GetRName("Material/defaultmaterial.instmtl"), "OffSrcCopyPost");

                FrameBufferClearColor TempClearColor = new FrameBufferClearColor();
                TempClearColor.r = 0.0f;
                TempClearColor.g = 0.0f;
                TempClearColor.b = 0.0f;
                TempClearColor.a = 0.0f;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mFBClearColorRT0       = TempClearColor;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mDepthClearValue       = 1.0f;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mStencilClearValue     = 0u;
            }

            Camera = camera;
            Camera.SetSceneView(RHICtx, BaseSceneView);

            bool IsReady = await mSSM.Init(RHICtx);

            if (IsReady == false)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"SSM Error", "");
                return(false);
            }

            IsReady = await mBloomMobile.Init(RHICtx, width, height, BaseSceneView);

            if (IsReady == false)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"BloomError", "");
                return(false);
            }

            //sun shaft;
            IsReady = await mSunShaftMobile.Init(RHICtx, width, height);

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

            //mobile ao;
            IsReady = await mMobileAO.Init(RHICtx, width, height, BaseSceneView);

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

            //
            mOpaqueSE.mTex_ShadowMap = mSSM.mShadowMapView.FrameBuffer.GetSRV_DepthStencil();
            mOpaqueSE.EnvMapName     = CEngine.Instance.Desc.DefaultEnvMap;
            mOpaqueSE.EyeEnvMapName  = CEngine.Instance.Desc.DefaultEyeEnvMap;

            mCustomTranslucentSE.EnvMapName     = CEngine.Instance.Desc.DefaultEnvMap;
            mCustomTranslucentSE.mTex_ShadowMap = mSSM.mShadowMapView.FrameBuffer.GetSRV_DepthStencil();

            mTranslucentSE.EnvMapName = CEngine.Instance.Desc.DefaultEnvMap;

            mCopySE.mBaseSceneView = BaseSceneView.FrameBuffer.GetSRV_RenderTarget(0);
            if (CEngine.EnableBloom == true)
            {
                mCopySE.mBloomTex = mBloomMobile.mUSView8.FrameBuffer.GetSRV_RenderTarget(0);
            }
            else
            {
                mCopySE.mBloomTex = BaseSceneView.FrameBuffer.GetSRV_RenderTarget(0);
            }
            mCopySE.VignetteTex  = CEngine.Instance.Desc.DefaultVignette;
            mCopySE.mSunShaftTex = mSunShaftMobile.mView_Blur.FrameBuffer.GetSRV_RenderTarget(0);
            //mCopySE.mSRV_MobileAo = mMobileAO.mView_BlurV.FrameBuffer.GetSRV_RenderTarget(0);
            mCopySE.mSRV_MobileAo = mMobileAO.mView_AoMask.FrameBuffer.GetSRV_RenderTarget(0);

            {
                var Tex2DDesc = mOpaqueSE.EnvMap.TxPicDesc;
                BaseSceneView.mEnvMapMipMaxLevel = Tex2DDesc.MipLevel - 1;

                Tex2DDesc = mOpaqueSE.EyeEnvMap.TxPicDesc;
                BaseSceneView.mEyeEnvMapMaxMipLevel = Tex2DDesc.MipLevel - 1;

                var ViewportSizeAndRcp = new Vector4(width, height, 1.0f / width, 1.0f / height);
                mCopyPostprocessPass.mScreenView.ViewportSizeAndRcp = ViewportSizeAndRcp;
            }

            return(true);
        }
Exemple #16
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;
        }
Exemple #17
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;
        }
Exemple #18
0
        public override async System.Threading.Tasks.Task <bool> Init(CRenderContext RHICtx, UInt32 width, UInt32 height, CGfxCamera camera, IntPtr WinHandle)
        {
            CGfxSceneViewInfo SnapshotViewInfo = new CGfxSceneViewInfo();

            SnapshotViewInfo.mUseDSV = true;
            SnapshotViewInfo.Width   = width;
            SnapshotViewInfo.Height  = height;
            SnapshotViewInfo.mDSVDesc.Init();
            SnapshotViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D24_UNORM_S8_UINT;
            SnapshotViewInfo.mDSVDesc.Width  = width;
            SnapshotViewInfo.mDSVDesc.Height = height;

            CRenderTargetViewDesc rtDesc0 = new CRenderTargetViewDesc();

            rtDesc0.Init();
            rtDesc0.Format = EPixelFormat.PXF_R8G8B8A8_UNORM;
            rtDesc0.Width  = width;
            rtDesc0.Height = height;
            SnapshotViewInfo.mRTVDescArray.Add(rtDesc0);

            BaseSceneView = new CGfxSceneView();
            if (false == BaseSceneView.Init(RHICtx, null, SnapshotViewInfo))
            {
                return(false);
            }

            Camera = camera;
            //mCamera.SetSceneView(RHICtx, mBaseSceneView);

            mRenderPassDesc_Snapshot = new CRenderPassDesc();
            FrameBufferClearColor TempClearColor = new FrameBufferClearColor();

            TempClearColor.r = 0.0f;
            TempClearColor.g = 0.0f;
            TempClearColor.b = 0.0f;
            TempClearColor.a = 0.0f;
            mRenderPassDesc_Snapshot.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Snapshot.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Snapshot.mFBClearColorRT0       = TempClearColor;
            mRenderPassDesc_Snapshot.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Snapshot.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Snapshot.mDepthClearValue       = 1.0f;
            mRenderPassDesc_Snapshot.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Snapshot.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Snapshot.mStencilClearValue     = 0u;

            mRenderPassDesc_Final = new CRenderPassDesc();
            TempClearColor.r      = 0.0f;
            TempClearColor.g      = 1.0f;
            TempClearColor.b      = 0.0f;
            TempClearColor.a      = 0.0f;
            mRenderPassDesc_Final.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Final.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Final.mFBClearColorRT0       = TempClearColor;
            mRenderPassDesc_Final.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Final.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Final.mDepthClearValue       = 1.0f;
            mRenderPassDesc_Final.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Final.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Final.mStencilClearValue     = 0u;

            if (mSnapshotSE == null)
            {
                mSnapshotSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxSnapshotSE>();
            }
            if (mCopySE == null)
            {
                mCopySE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileCopySE>();
            }

            var ufoViewInfo = new CGfxScreenViewDesc();

            ufoViewInfo.IsSwapChainBuffer   = false;
            ufoViewInfo.UseDepthStencilView = false;
            ufoViewInfo.Width  = width;
            ufoViewInfo.Height = height;

            var rtDesc1 = new CRenderTargetViewDesc();

            rtDesc1.Init();
            rtDesc1.mCanBeSampled = vBOOL.FromBoolean(true);
            rtDesc1.Format        = EPixelFormat.PXF_R8G8B8A8_UNORM;
            rtDesc1.Width         = width;
            rtDesc1.Height        = height;
            ufoViewInfo.mRTVDescArray.Add(rtDesc1);

            var screenAlignedTriangle = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(RHICtx, CEngineDesc.ScreenAlignedTriangleName, true);

            mScreenAlignedTriangle = CEngine.Instance.MeshManager.CreateMesh(RHICtx, screenAlignedTriangle);
            var mtl = await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(RHICtx, RName.GetRName("Material/defaultmaterial.instmtl"));

            mScreenAlignedTriangle.SetMaterialInstance(RHICtx, 0, mtl, CEngine.Instance.PrebuildPassData.DefaultShadingEnvs);
            //await mScreenAlignedTriangle.AwaitEffects();
            mFinalView = new CGfxScreenView();
            await mFinalView.Init(RHICtx, null, ufoViewInfo, mCopySE, mtl, mScreenAlignedTriangle);

            var viewportSizeAndRcp = new Vector4(width, height, 1.0f / width, 1.0f / height);

            mFinalView.ViewportSizeAndRcp = viewportSizeAndRcp;

            return(true);
        }
Exemple #19
0
        public void TickLogic(CRenderContext RHICtx, CGfxCamera ViewerCamera, Vector3 DirLightDir)
        {
            ScopeTickLogic.Begin();

            ViewerCamera.mShadowDistance = mShadowDistance;
            m_refViewerCamera            = ViewerCamera;
            mDirLightDirection           = DirLightDir;

            //calculate viewer camera frustum bounding sphere and shadow camera data;
            float   HalfFoV         = ViewerCamera.FoV * 0.5f;
            float   NearUpLength    = ViewerCamera.ZNear * (float)Math.Tan(HalfFoV);
            float   NearRightLength = NearUpLength * ViewerCamera.Aspect;
            Vector3 NearUpOffset    = NearUpLength * ViewerCamera.CameraData.Up;
            Vector3 NearRightOffset = NearRightLength * ViewerCamera.CameraData.Right;

            float   FarUpLength    = mShadowDistance * (float)Math.Tan(HalfFoV);
            float   FarRightLength = FarUpLength * ViewerCamera.Aspect;
            Vector3 FarUpOffset    = FarUpLength * ViewerCamera.CameraData.Up;
            Vector3 FarRightOffset = FarRightLength * ViewerCamera.CameraData.Right;

            mSSM_FrustumVtx[0] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * ViewerCamera.ZNear + NearRightOffset + NearUpOffset; //nrt;
            mSSM_FrustumVtx[1] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * ViewerCamera.ZNear + NearRightOffset - NearUpOffset; //nrb;
            mSSM_FrustumVtx[2] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * ViewerCamera.ZNear - NearRightOffset + NearUpOffset; //nlt;
            mSSM_FrustumVtx[3] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * ViewerCamera.ZNear - NearRightOffset - NearUpOffset; //nlb;
            mSSM_FrustumVtx[4] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * mShadowDistance + FarRightOffset + FarUpOffset;      //frt;
            mSSM_FrustumVtx[5] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * mShadowDistance + FarRightOffset - FarUpOffset;      //frb;
            mSSM_FrustumVtx[6] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * mShadowDistance - FarRightOffset + FarUpOffset;      //flt;
            mSSM_FrustumVtx[7] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * mShadowDistance - FarRightOffset - FarUpOffset;      //flb;

            //float MaxFrustumDiagonal = Vector3.Distance(SSM_FrustumVtx[3], SSM_FrustumVtx[4]);

            float TanHalfFoVHeight = (float)Math.Tan(HalfFoV);
            float TanHalfFoVWidth  = TanHalfFoVHeight * ViewerCamera.Aspect;
            float FrustumLength    = mShadowDistance - ViewerCamera.ZNear;

            float NearHalfWidth       = ViewerCamera.ZNear * TanHalfFoVWidth;
            float NearHalfHeight      = ViewerCamera.ZNear * TanHalfFoVHeight;
            float NearHalfDiagonalSqr = NearHalfWidth * NearHalfWidth + NearHalfHeight * NearHalfHeight;
            float FarHalfWidth        = mShadowDistance * TanHalfFoVWidth;
            float FarHalfHeight       = mShadowDistance * TanHalfFoVHeight;
            float FarHalfDiagonalSqr  = FarHalfWidth * FarHalfWidth + FarHalfHeight * FarHalfHeight;

            float   OptimalOffset       = FrustumLength * 0.5f + (NearHalfDiagonalSqr - FarHalfDiagonalSqr) / (2.0f * FrustumLength);
            float   ViewerPosOffset     = Clamp(mShadowDistance - OptimalOffset, ViewerCamera.ZNear, mShadowDistance);
            Vector3 FrustumSphereCenter = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * ViewerPosOffset;
            float   FrustumSphereRadius = 1.0f;

            for (UInt32 idx = 0; idx < 8; idx++)
            {
                FrustumSphereRadius = Math.Max(FrustumSphereRadius, Vector3.DistanceSquared(FrustumSphereCenter, mSSM_FrustumVtx[idx]));
            }
            FrustumSphereRadius = (float)Math.Ceiling((float)Math.Sqrt(FrustumSphereRadius));
            //FrustumSphereRadius = Math.Min((float)Math.Sqrt(FrustumSphereRadius), MaxFrustumDiagonal * 0.5f);

            Vector3 ShadowCameraPos = FrustumSphereCenter - mDirLightDirection * (FrustumSphereRadius + mShadowCameraOffset);

            mShadowCamera.LookAtLH(ShadowCameraPos, FrustumSphereCenter, Vector3.UnitY, true);
            float FrustumSphereDiameter = FrustumSphereRadius * 2.0f;
            float ShadowCameraZFar      = mShadowCameraOffset + FrustumSphereDiameter;
            float ShadowCameraZNear     = 0.0f;

            mShadowCamera.MakeOrtho(FrustumSphereDiameter, FrustumSphereDiameter, ShadowCameraZNear, ShadowCameraZFar);
            Vector4 WorldCenterNDC       = Vector4.Transform(new Vector4(0.0f, 0.0f, 0.0f, 1.0f), mShadowCamera.CameraData.ViewProjection);
            float   TexelPosX            = (WorldCenterNDC.X * 0.5f + 0.5f) * mResolutionY;
            float   TexelPosAdjustedNdcX = ((float)Math.Floor(TexelPosX) / mResolutionY - 0.5f) / 0.5f;
            float   TexelOffsetNdcX      = TexelPosAdjustedNdcX - WorldCenterNDC.X;
            float   TexelPosY            = (WorldCenterNDC.Y * (-0.5f) + 0.5f) * mResolutionY;
            float   TexelPosAdjustedNdcY = ((float)Math.Floor(TexelPosY) / mResolutionY - 0.5f) / (-0.5f);
            float   TexelOffsetNdcY      = TexelPosAdjustedNdcY - WorldCenterNDC.Y;

            mShadowCamera.DoOrthoProjectionForShadow(FrustumSphereDiameter, FrustumSphereDiameter, ShadowCameraZNear, ShadowCameraZFar, TexelOffsetNdcX, TexelOffsetNdcY);


            //mShadowCamera.LookAtLH(ShadowCameraPos, FrustumSphereCenter, Vector3.UnitY);
            //float FrustumSphereDiameter = FrustumSphereRadius * 2.0f;
            //float TexelPerUnit = mResolutionY / FrustumSphereDiameter;
            //Matrix TempViewMtx = mShadowCamera.ViewMatrix;
            //TempViewMtx.M11 *= TexelPerUnit;
            //TempViewMtx.M22 *= TexelPerUnit;
            //Matrix TempViewMtxInverse = Matrix.Invert(ref TempViewMtx);
            //Vector4 FrustumSphereCenterViewSpace = Vector4.Transform(new Vector4(FrustumSphereCenter, 1.0f), TempViewMtx);
            //FrustumSphereCenterViewSpace.X = (float)Math.Floor(FrustumSphereCenterViewSpace.X);
            //FrustumSphereCenterViewSpace.Y = (float)Math.Floor(FrustumSphereCenterViewSpace.Y);

            //Vector4 FrustumSphereCenterWS = Vector4.Transform(FrustumSphereCenterViewSpace, TempViewMtxInverse);
            //FrustumSphereCenter.X = FrustumSphereCenterWS.X;
            //FrustumSphereCenter.Y = FrustumSphereCenterWS.Y;
            //FrustumSphereCenter.Z = FrustumSphereCenterWS.Z;

            //ShadowCameraPos = FrustumSphereCenter - mDirLightDirection * (FrustumSphereRadius + mShadowCameraOffset);
            //mShadowCamera.LookAtLH(ShadowCameraPos, FrustumSphereCenter, Vector3.UnitY);
            //float ShadowCameraZFar = mShadowCameraOffset + FrustumSphereDiameter;
            //float ShadowCameraZNear = 0.0f;
            //mShadowCamera.MakeOrtho(FrustumSphereDiameter, FrustumSphereDiameter, ShadowCameraZNear, ShadowCameraZFar);


            mViewer2ShadowMtx = mShadowCamera.CameraData.ViewProjection * mOrtho2UVMtx;

            float UniformDepthBias      = 2.0f;
            float PerObjCustomDepthBias = 1.0f;
            float DepthBiasClipSpace    = UniformDepthBias / (ShadowCameraZFar - ShadowCameraZNear) * (FrustumSphereDiameter / mResolutionY) * PerObjCustomDepthBias;

            mShadowMapView.mDepthBiasAndZFarRcp = new Vector2(0.0f, 1.0f / ShadowCameraZFar);

            mShadowTransitionScale = 1.0f / (DepthBiasClipSpace + 0.00001f);

            float FadeStartDistance = mShadowDistance - mShadowDistance * mFadeStrength;

            mFadeParam.X = 1.0f / (mShadowDistance - FadeStartDistance + 0.0001f);
            mFadeParam.Y = -FadeStartDistance * mFadeParam.X;

            ViewerCamera.PushVisibleMesh2ShadowLayer(mShadowCamera.CullingFrustum);
            mShadowMapView.CookShadowLayerData2Pass(RHICtx, m_refViewerCamera, mShadowCamera, mSE_SSM);
            var CmdList = mCmdListDB_Shadow[0];

            mShadowMapView.PushSpecRenderLayerDataToRHI(CmdList, ERenderLayer.RL_Shadow);

            CmdList.BeginCommand();
            CmdList.BeginRenderPass(mRenderPassDesc_SSM, mShadowMapView.FrameBuffer);
            CmdList.BuildRenderPass(DPLimitter);
            CmdList.EndRenderPass();
            CmdList.EndCommand();

            ViewerCamera.ClearSpecRenderLayerData(ERenderLayer.RL_Shadow);

            DrawCall     = CmdList.DrawCall;
            DrawTriangle = CmdList.DrawTriangle;

            ScopeTickLogic.End();
        }
        public async System.Threading.Tasks.Task <bool> Init(UInt32 width, UInt32 height, CGfxCamera camera)
        {
            CGfxSceneViewInfo VI_PickedSetUp = new CGfxSceneViewInfo();

            VI_PickedSetUp.mUseDSV = true;
            UInt32 TempWidth  = width;
            UInt32 TempHeight = height;

            VI_PickedSetUp.Width  = TempWidth;
            VI_PickedSetUp.Height = TempHeight;
            VI_PickedSetUp.mDSVDesc.Init();
            VI_PickedSetUp.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D24_UNORM_S8_UINT;
            VI_PickedSetUp.mDSVDesc.Width  = TempWidth;
            VI_PickedSetUp.mDSVDesc.Height = TempHeight;

            CRenderTargetViewDesc RTVDesc_PickeSetUp = new CRenderTargetViewDesc();

            RTVDesc_PickeSetUp.Init();
            RTVDesc_PickeSetUp.Format = EPixelFormat.PXF_R16G16_FLOAT;
            RTVDesc_PickeSetUp.Width  = TempWidth;
            RTVDesc_PickeSetUp.Height = TempHeight;
            VI_PickedSetUp.mRTVDescArray.Add(RTVDesc_PickeSetUp);

            mSV_PickedSetUp = new CGfxSceneView();
            if (false == mSV_PickedSetUp.Init(mRHICtx, null, VI_PickedSetUp))
            {
                return(false);
            }

            mSE_PickedSetUp  = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxPickedSetUpSE>();
            mSE_PickedBlurH  = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxPickedBlurHSE>();
            mSE_PickedBlurV  = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxPickedBlurVSE>();
            mSE_PickedHollow = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxPickedHollowSE>();
            mBlurAndHollowSEArray.Add(mSE_PickedBlurH);
            mBlurAndHollowSEArray.Add(mSE_PickedHollow);

            var ScreenAlignedTriangle = CEngine.Instance.MeshPrimitivesManager.GetMeshPrimitives(mRHICtx, CEngineDesc.ScreenAlignedTriangleName, true);
            var DefaultMtlInst        = await CEngine.Instance.MaterialInstanceManager.GetMaterialInstanceAsync(mRHICtx, RName.GetRName("Material/defaultmaterial.instmtl"));

            mScreenAlignedTriangle = CEngine.Instance.MeshManager.CreateMesh(mRHICtx, ScreenAlignedTriangle);
            mScreenAlignedTriangle.SetMaterialInstance(mRHICtx, 0, DefaultMtlInst, CEngine.Instance.PrebuildPassData.DefaultShadingEnvs);
            //await mScreenAlignedTriangle.AwaitEffects();

            //blur h and hollow;
            {
                CGfxScreenViewDesc VI_BlurH = new CGfxScreenViewDesc();
                VI_BlurH.UseDepthStencilView = false;
                VI_BlurH.Width  = TempWidth;
                VI_BlurH.Height = TempHeight;

                var RTVDesc_BlurH = new CRenderTargetViewDesc();
                RTVDesc_BlurH.Init();
                RTVDesc_BlurH.Format = EPixelFormat.PXF_R16G16_FLOAT;
                VI_BlurH.mRTVDescArray.Add(RTVDesc_BlurH);
                mSV_PickedBlurH = new CGfxScreenView();
                if (await mSV_PickedBlurH.InitForMultiPassMode(mRHICtx, VI_BlurH, mBlurAndHollowSEArray, DefaultMtlInst, mScreenAlignedTriangle) == false)
                {
                    return(false);
                }
            }

            //blur v;
            {
                CGfxScreenViewDesc VI_BlurV = new CGfxScreenViewDesc();
                VI_BlurV.UseDepthStencilView = false;
                VI_BlurV.Width  = TempWidth;
                VI_BlurV.Height = TempHeight;

                var RTVDesc_BlurV = new CRenderTargetViewDesc();
                RTVDesc_BlurV.Init();
                RTVDesc_BlurV.Format = EPixelFormat.PXF_R16G16_FLOAT;
                VI_BlurV.mRTVDescArray.Add(RTVDesc_BlurV);
                mSV_PickedBlurV = new CGfxScreenView();
                if (await mSV_PickedBlurV.Init(mRHICtx, null, VI_BlurV, mSE_PickedBlurV, DefaultMtlInst, mScreenAlignedTriangle) == false)
                {
                    return(false);
                }
            }

            mCamera = camera;

            mRenderPassDesc_Picked = new CRenderPassDesc();
            FrameBufferClearColor TempClearColor = new FrameBufferClearColor();

            TempClearColor.r = 0.0f;
            TempClearColor.g = 1.0f;
            TempClearColor.b = 0.0f;
            TempClearColor.a = 0.0f;
            mRenderPassDesc_Picked.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Picked.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Picked.mFBClearColorRT0       = TempClearColor;
            mRenderPassDesc_Picked.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Picked.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Picked.mDepthClearValue       = 1.0f;
            mRenderPassDesc_Picked.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_Picked.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_Picked.mStencilClearValue     = 0u;

            mSE_PickedBlurH.mSRV_PickedSetUp  = mSV_PickedSetUp.FrameBuffer.GetSRV_RenderTarget(0);
            mSE_PickedBlurV.mSRV_PickedBlurH  = mSV_PickedBlurH.FrameBuffer.GetSRV_RenderTarget(0);
            mSE_PickedHollow.mSRV_PickedSetUp = mSV_PickedSetUp.FrameBuffer.GetSRV_RenderTarget(0);
            mSE_PickedHollow.mSRV_PickedBlur  = mSV_PickedBlurV.FrameBuffer.GetSRV_RenderTarget(0);

            var ViewportSizeAndRcp = new Vector4(TempWidth, TempHeight, 1.0f / TempWidth, 1.0f / TempHeight);

            mSV_PickedBlurH.ViewportSizeAndRcp = ViewportSizeAndRcp;
            mSV_PickedBlurV.ViewportSizeAndRcp = ViewportSizeAndRcp;

            return(true);
        }
Exemple #21
0
        public override async System.Threading.Tasks.Task <bool> Init(CRenderContext RHICtx, UInt32 width, UInt32 height, CGfxCamera camera, IntPtr WinHandle)
        {
            if (RHICtx == null)
            {
                RHICtx = CEngine.Instance.RenderContext;
            }

            if (mOpaqueSE == null)
            {
                mOpaqueSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileOpaqueSE>();
            }

            if (mCustomTranslucentSE == null)
            {
                mCustomTranslucentSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileCustomTranslucentSE>();
            }

            if (mTranslucentSE == null)
            {
                mTranslucentSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileTranslucentSE>();
            }

            if (mCopySE == null)
            {
                mCopySE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileCopySE>();
            }

            if (mSE_MobileSky == null)
            {
                mSE_MobileSky = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxSE_MobileSky>();
            }

            if (mOpaqueSE == null || mCustomTranslucentSE == null || mTranslucentSE == null || mCopySE == null || mSE_MobileSky == null)
            {
                return(false);
            }

            {
                //base scene view;
                CGfxSceneViewInfo BaseViewInfo = new CGfxSceneViewInfo();
                BaseViewInfo.mUseDSV = true;
                BaseViewInfo.Width   = width;
                BaseViewInfo.Height  = height;
                BaseViewInfo.mDSVDesc.Init();
                BaseViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D24_UNORM_S8_UINT;
                BaseViewInfo.mDSVDesc.Width  = width;
                BaseViewInfo.mDSVDesc.Height = height;

                CRenderTargetViewDesc rtDesc0 = new CRenderTargetViewDesc();
                rtDesc0.Init();
                if (RHICtx.ContextCaps.SupportHalfRT == 0)
                {
                    CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <EnvShader.CGfxMobileOpaqueSE>().SetMacroDefineValue("ENV_DISABLE_AO", "1");
                    CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <EnvShader.CGfxMobileCopySE>().SetMacroDefineValue("ENV_DISABLE_AO", "1");
                    CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <Bricks.GpuDriven.GpuScene.CGfxMergeInstanceSE>().SetMacroDefineValue("ENV_DISABLE_AO", "1");
                    rtDesc0.Format = EPixelFormat.PXF_R8G8B8A8_UNORM;
                }
                else
                {
                    CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <EnvShader.CGfxMobileOpaqueSE>().SetMacroDefineValue("ENV_DISABLE_AO", "0");
                    CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <EnvShader.CGfxMobileCopySE>().SetMacroDefineValue("ENV_DISABLE_AO", "0");
                    CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <Bricks.GpuDriven.GpuScene.CGfxMergeInstanceSE>().SetMacroDefineValue("ENV_DISABLE_AO", "0");
                    rtDesc0.Format = EPixelFormat.PXF_R16G16B16A16_FLOAT;
                }
                Profiler.Log.WriteLine(Profiler.ELogTag.Info, "Graphics", $"MobileGame render texture format: {rtDesc0.Format}");
                rtDesc0.Width  = width;
                rtDesc0.Height = height;
                BaseViewInfo.mRTVDescArray.Add(rtDesc0);

                BaseSceneView = new CGfxSceneView();
                if (false == BaseSceneView.Init(RHICtx, null, BaseViewInfo))
                {
                    return(false);
                }
                BaseSceneView.UIHost = await CEngine.Instance.UIManager.RegisterHost("Game");

                BaseSceneView.UIHost.IsInputActive = true;
                BaseSceneView.UIHost.WindowSize    = new SizeF(width, height);

                mForwardBasePass = new CGfxFramePass(RHICtx, "GameForwordBasePse");
                mForwardBasePass.mBaseSceneView = BaseSceneView;

                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Opaque, PrebuildPassIndex.PPI_OpaquePbr, mOpaqueSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_CustomOpaque, PrebuildPassIndex.PPI_OpaquePbr, mOpaqueSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Sky, PrebuildPassIndex.PPI_Sky, mSE_MobileSky);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_CustomTranslucent, PrebuildPassIndex.PPI_CustomTranslucentPbr, mCustomTranslucentSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Translucent, PrebuildPassIndex.PPI_TransparentPbr, mTranslucentSE);

                FrameBufferClearColor TempClearColor = new FrameBufferClearColor();
                TempClearColor.r = 0.0f;
                TempClearColor.g = 0.0f;
                TempClearColor.b = 0.0f;
                TempClearColor.a = 1.0f;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mFBClearColorRT0       = TempClearColor;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mDepthClearValue       = 1.0f;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mStencilClearValue     = 0u;
            }

            {
                EngineNS.CSwapChainDesc SwapChainDesc;
                SwapChainDesc.Format       = EngineNS.EPixelFormat.PXF_R8G8B8A8_UNORM;
                SwapChainDesc.Width        = width;
                SwapChainDesc.Height       = height;
                SwapChainDesc.WindowHandle = WinHandle;
                SwapChainDesc.ColorSpace   = EColorSpace.COLOR_SPACE_SRGB_NONLINEAR;
                SwapChain = RHICtx.CreateSwapChain(SwapChainDesc);
                //RHICtx.BindCurrentSwapChain(mSwapChain);

                //ufo scene view;
                CGfxScreenViewDesc UFOViewInfo = new CGfxScreenViewDesc();
                UFOViewInfo.IsSwapChainBuffer   = true;
                UFOViewInfo.UseDepthStencilView = false;
                UFOViewInfo.Width  = width;
                UFOViewInfo.Height = height;

                var rtDesc1 = new CRenderTargetViewDesc();
                rtDesc1.mCanBeSampled = vBOOL.FromBoolean(false);
                UFOViewInfo.mRTVDescArray.Add(rtDesc1);

                mCopyPostprocessPass = new CGfxPostprocessPass();
                await mCopyPostprocessPass.Init(RHICtx, SwapChain, UFOViewInfo, mCopySE, RName.GetRName("Material/defaultmaterial.instmtl"), "GameCopyPost");

                FrameBufferClearColor TempClearColor = new FrameBufferClearColor();
                TempClearColor.r = 0.0f;
                TempClearColor.g = 0.0f;
                TempClearColor.b = 0.0f;
                TempClearColor.a = 0.0f;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mFBClearColorRT0       = TempClearColor;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mDepthClearValue       = 1.0f;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mStencilClearValue     = 0u;
            }

            Camera = camera;
            Camera.SetSceneView(RHICtx, BaseSceneView);

            //shadow ssm;
            bool IsReady = await mSSM.Init(RHICtx);

            if (IsReady == false)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"SSM Error", "");
                return(false);
            }

            //post effect;
            IsReady = await mBloomMobile.Init(RHICtx, width, height, BaseSceneView);

            if (IsReady == false)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"BloomError", "");
                return(false);
            }

            //sun shaft;
            IsReady = await mSunShaftMobile.Init(RHICtx, width, height);

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

            //mobile ao;
            IsReady = await mMobileAO.Init(RHICtx, width, height, BaseSceneView);

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

            //
            mOpaqueSE.mTex_ShadowMap = mSSM.mShadowMapView.FrameBuffer.GetSRV_DepthStencil();
            mOpaqueSE.EnvMapName     = CEngine.Instance.Desc.DefaultEnvMap;
            mOpaqueSE.EyeEnvMapName  = CEngine.Instance.Desc.DefaultEyeEnvMap;

            mCustomTranslucentSE.EnvMapName     = CEngine.Instance.Desc.DefaultEnvMap;
            mCustomTranslucentSE.mTex_ShadowMap = mSSM.mShadowMapView.FrameBuffer.GetSRV_DepthStencil();

            mTranslucentSE.EnvMapName = CEngine.Instance.Desc.DefaultEnvMap;

            mCopySE.mBaseSceneView = BaseSceneView.FrameBuffer.GetSRV_RenderTarget(0);
            if (CEngine.EnableBloom == true)
            {
                mCopySE.mBloomTex = mBloomMobile.mUSView8.FrameBuffer.GetSRV_RenderTarget(0);
            }
            else
            {
                mCopySE.mBloomTex = BaseSceneView.FrameBuffer.GetSRV_RenderTarget(0);
            }
            mCopySE.VignetteTex  = CEngine.Instance.Desc.DefaultVignette;
            mCopySE.mSunShaftTex = mSunShaftMobile.mView_Blur.FrameBuffer.GetSRV_RenderTarget(0);
            //mCopySE.mSRV_MobileAo = mMobileAO.mView_BlurV.FrameBuffer.GetSRV_RenderTarget(0);
            mCopySE.mSRV_MobileAo = mMobileAO.mView_AoMask.FrameBuffer.GetSRV_RenderTarget(0);

            {
                var Tex2DDesc = mOpaqueSE.EnvMap.TxPicDesc;
                BaseSceneView.mEnvMapMipMaxLevel = Tex2DDesc.MipLevel - 1;

                Tex2DDesc = mOpaqueSE.EyeEnvMap.TxPicDesc;
                BaseSceneView.mEyeEnvMapMaxMipLevel = Tex2DDesc.MipLevel - 1;

                var ViewportSizeAndRcp = new Vector4(width, height, 1.0f / width, 1.0f / height);
                mCopyPostprocessPass.mScreenView.ViewportSizeAndRcp = ViewportSizeAndRcp;
            }

            return(true);
        }
        public override async System.Threading.Tasks.Task <bool> Init(CRenderContext rc, UInt32 width, UInt32 height, CGfxCamera camera, IntPtr WinHandle)
        {
            if (mOpaqueSE == null)
            {
                mOpaqueSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileOpaqueEditorSE>();
            }

            if (mCustomTranslucentSE == null)
            {
                mCustomTranslucentSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileCustomTranslucentEditorSE>();
            }

            if (mTranslucentSE == null)
            {
                mTranslucentSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileTranslucentSE>();
            }

            if (mGizmosSE == null)
            {
                mGizmosSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxGizmosSE>();
            }

            mCopyEditorSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxMobileCopyEditorSE>();

            if (mSE_MobileSky == null)
            {
                mSE_MobileSky = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxSE_MobileSky>();
            }

            if (mOpaqueSE == null || mCustomTranslucentSE == null || mTranslucentSE == null || mGizmosSE == null || mCopyEditorSE == null || mSE_MobileSky == null)
            {
                return(false);
            }

            //shadow csm;
            bool IsReady = await mCSM.Init(rc);

            if (IsReady == false)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"SSM Error", "");
                return(false);
            }

            //hitproxy;
            IsReady = mHitProxy.Init(width, height, camera);
            if (IsReady == false)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"HitProxyError", "");
                return(false);
            }
            //mHitProxy.mEnabled = true;

            IsReady = await mPickedEffect.Init(width, height, camera);

            if (IsReady == false)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"PickedEffectError", "");
                return(false);
            }

            {
                //base scene view;
                CGfxSceneViewInfo BaseViewInfo = new CGfxSceneViewInfo();
                BaseViewInfo.mUseDSV = true;
                BaseViewInfo.Width   = width;
                BaseViewInfo.Height  = height;
                BaseViewInfo.mDSVDesc.Init();
                BaseViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D24_UNORM_S8_UINT;
                BaseViewInfo.mDSVDesc.Width  = width;
                BaseViewInfo.mDSVDesc.Height = height;

                CRenderTargetViewDesc rtDesc0 = new CRenderTargetViewDesc();
                rtDesc0.Init();
                //rtDesc0.Format = EPixelFormat.PXF_R8G8B8A8_UNORM;
                rtDesc0.Format = EPixelFormat.PXF_R16G16B16A16_FLOAT;
                rtDesc0.Width  = width;
                rtDesc0.Height = height;
                BaseViewInfo.mRTVDescArray.Add(rtDesc0);

                BaseSceneView = new CGfxSceneView();
                if (false == BaseSceneView.Init(rc, null, BaseViewInfo))
                {
                    return(false);
                }
                BaseSceneView.UIHost = await CEngine.Instance.UIManager.RegisterHost("Editor");

                //BaseSceneView.UIHost.IsInputActive = false;
                BaseSceneView.UIHost.WindowSize = new SizeF(width, height);

                mForwardBasePass = new CGfxFramePass(rc, "GameForwordBasePass");
                mForwardBasePass.mBaseSceneView = BaseSceneView;
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Opaque, PrebuildPassIndex.PPI_OpaquePbrEditor, mOpaqueSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_CustomOpaque, PrebuildPassIndex.PPI_OpaquePbrEditor, mOpaqueSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Sky, PrebuildPassIndex.PPI_Sky, mSE_MobileSky);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_CustomTranslucent, PrebuildPassIndex.PPI_CustomTranslucentPbrEditor, mCustomTranslucentSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Translucent, PrebuildPassIndex.PPI_TransparentPbr, mTranslucentSE);
                mForwardBasePass.SetRLayerParameter(ERenderLayer.RL_Gizmos, PrebuildPassIndex.PPI_Gizmos, mGizmosSE);

                FrameBufferClearColor TempClearColor = new FrameBufferClearColor();
                TempClearColor.r = 0.0f;
                TempClearColor.g = 0.0f;
                TempClearColor.b = 0.0f;
                TempClearColor.a = 1.0f;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mFBClearColorRT0       = TempClearColor;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mDepthClearValue       = 1.0f;
                mForwardBasePass.mRenderPassDesc.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
                mForwardBasePass.mRenderPassDesc.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
                mForwardBasePass.mRenderPassDesc.mStencilClearValue     = 0u;
            }

            {
                EngineNS.CSwapChainDesc SwapChainDesc;
                SwapChainDesc.Format       = EngineNS.EPixelFormat.PXF_R8G8B8A8_UNORM;
                SwapChainDesc.Width        = width;
                SwapChainDesc.Height       = height;
                SwapChainDesc.WindowHandle = WinHandle;
                SwapChainDesc.ColorSpace   = EColorSpace.COLOR_SPACE_SRGB_NONLINEAR;
                SwapChain = rc.CreateSwapChain(SwapChainDesc);
                //RHICtx.BindCurrentSwapChain(mSwapChain);

                //final scene view;
                CGfxScreenViewDesc FinalViewInfo = new CGfxScreenViewDesc();
                FinalViewInfo.IsSwapChainBuffer   = true;
                FinalViewInfo.UseDepthStencilView = false;
                FinalViewInfo.Width  = width;
                FinalViewInfo.Height = height;

                var rtvDesc1 = new CRenderTargetViewDesc();
                rtvDesc1.mCanBeSampled = vBOOL.FromBoolean(false);
                rtvDesc1.Format        = SwapChainDesc.Format;
                FinalViewInfo.mRTVDescArray.Add(rtvDesc1);

                mCopyPostprocessPass = new CGfxPostprocessPass();
                await mCopyPostprocessPass.Init(rc, SwapChain, FinalViewInfo, mCopyEditorSE, RName.GetRName("Material/defaultmaterial.instmtl"), "EditorCopyPost");

                FrameBufferClearColor TempClearColor = new FrameBufferClearColor();
                TempClearColor.r = 0.0f;
                TempClearColor.g = 0.0f;
                TempClearColor.b = 0.0f;
                TempClearColor.a = 0.0f;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mFBClearColorRT0       = TempClearColor;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mDepthClearValue       = 1.0f;
                mCopyPostprocessPass.mRenderPassDesc.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
                mCopyPostprocessPass.mRenderPassDesc.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
                mCopyPostprocessPass.mRenderPassDesc.mStencilClearValue     = 0u;
            }

            Camera = camera;
            Camera.SetSceneView(rc, BaseSceneView);

            //post effect;
            IsReady = await mBloomMobile.Init(rc, width, height, BaseSceneView);

            if (IsReady == false)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"BloomError", "");
                return(false);
            }

            //sun shaft;
            IsReady = await mSunShaftMobile.Init(rc, width, height);

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

            //mobile ao;
            IsReady = await mMobileAO.Init(rc, width, height, BaseSceneView);

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

            //
            mOpaqueSE.mTex_ShadowMap = mCSM.mShadowMapView.FrameBuffer.GetSRV_DepthStencil();
            mOpaqueSE.EnvMapName     = CEngine.Instance.Desc.DefaultEnvMap;
            mOpaqueSE.EyeEnvMapName  = CEngine.Instance.Desc.DefaultEnvMap;

            mCustomTranslucentSE.EnvMapName     = CEngine.Instance.Desc.DefaultEnvMap;
            mCustomTranslucentSE.mTex_ShadowMap = mCSM.mShadowMapView.FrameBuffer.GetSRV_DepthStencil();

            mTranslucentSE.EnvMapName = CEngine.Instance.Desc.DefaultEnvMap;

            mCopyEditorSE.mBaseSceneView = BaseSceneView.FrameBuffer.GetSRV_RenderTarget(0);
            mCopyEditorSE.mBloomTex      = mBloomMobile.mUSView8.FrameBuffer.GetSRV_RenderTarget(0);
            mCopyEditorSE.mPickedTex     = mPickedEffect.mSV_PickedBlurH.FrameBuffer.GetSRV_RenderTarget(0);
            mCopyEditorSE.VignetteTex    = CEngine.Instance.Desc.DefaultVignette;
            mCopyEditorSE.mSunShaftTex   = mSunShaftMobile.mView_Blur.FrameBuffer.GetSRV_RenderTarget(0);
            //mCopyEditorSE.mSRV_MobileAo = mMobileAO.mView_BlurV.FrameBuffer.GetSRV_RenderTarget(0);
            mCopyEditorSE.mSRV_MobileAo = mMobileAO.mView_AoMask.FrameBuffer.GetSRV_RenderTarget(0);

            {
                var DirLightColor     = new Vector4(1.0f, 1.0f, 1.0f, 3.5f);
                var DirLightDirection = new Vector3(0.0f, -1.5f, 1.0f);
                DirLightDirection.Normalize();

                var SkyLightColor = new Vector3(0.12f, 0.12f, 0.25f);

                BaseSceneView.mDirLightDirection_Leak = new Vector4(DirLightDirection, 0.05f);
                BaseSceneView.DirLightColor_Intensity = DirLightColor;
                BaseSceneView.mSkyLightColor          = SkyLightColor;

                var Tex2DDesc = mOpaqueSE.EnvMap.TxPicDesc;
                BaseSceneView.mEnvMapMipMaxLevel = Tex2DDesc.MipLevel - 1;

                Tex2DDesc = mOpaqueSE.mEyeEnvMap.TxPicDesc;
                BaseSceneView.mEyeEnvMapMaxMipLevel = Tex2DDesc.MipLevel - 1;

                var ViewportSizeAndRcp = new Vector4(width, height, 1.0f / width, 1.0f / height);
                BaseSceneView.mViewportSizeAndRcp = ViewportSizeAndRcp;
                mCopyPostprocessPass.mScreenView.ViewportSizeAndRcp = ViewportSizeAndRcp;
            }

            this.OnDrawUI += (CCommandList cmd, Graphics.View.CGfxScreenView view) =>
            {
                if (BaseSceneView.UIHost != null)
                {
                    BaseSceneView.UIHost.Draw(CEngine.Instance.RenderContext, cmd, view);
                }
            };

#if Test_Snapshot
            await TestSnapRender(rc);
#endif
            return(true);
        }
Exemple #23
0
        public void TickLogic(CRenderContext RHICtx, CGfxCamera camera, CGfxSceneView BaseSceneView)
        {
            if (RHICtx == null)
            {
                System.Diagnostics.Debug.Assert(false);
                return;
            }

            if (CEngine.EnableMobileAo == true)
            {
                mAoParam.X = mRadius;
                mAoParam.Z = mBias;
                //float temp0 = 1.0f / (mRadius * mRadius * mRadius);
                //mDarkness = temp0 * temp0 * mDarkness;
                mAoParam.W = mDarkness;

                if (CEngine.Instance.RenderSystem.RHIType != ERHIType.RHT_OGL)
                {
                    mAoParam.Y = 1.0f;
                }
                else
                {
                    mAoParam.Y = -1.0f;
                }

                //ao mask pass
                var CmdList = mCLDB_AoMask[0];
                CmdList.BeginCommand();
                mSE_AoMask.mBaseSceneView = BaseSceneView.FrameBuffer.GetSRV_RenderTarget(0);
                mView_AoMask.AoParam      = mAoParam;
                mView_AoMask.CookViewportMeshToPassInMultiPassMode(RHICtx, mSE_AoMask, 0, camera, mScreenAlignedTriangle);
                mView_AoMask.PushPassToRHIInMultiPassMode(CmdList, 0);
                CmdList.BeginRenderPass(mRenderPassDesc_Ao, mView_AoMask.FrameBuffer);
                CmdList.BuildRenderPass();
                CmdList.EndRenderPass();
                CmdList.EndCommand();

                //ao blur h;
                CmdList = mCLDB_BlurH[0];
                CmdList.BeginCommand();
                //mSE_BlurH.mSRV_AoMask = mView_AoMask.FrameBuffer.GetSRV_RenderTarget(0);
                mView_BlurH.CookViewportMeshToPass(RHICtx, mSE_BlurH, camera, mScreenAlignedTriangle);
                mView_BlurH.PushPassToRHI(CmdList);
                CmdList.BeginRenderPass(mRenderPassDesc_Ao, mView_BlurH.FrameBuffer);
                CmdList.BuildRenderPass();
                CmdList.EndRenderPass();
                CmdList.EndCommand();

                //ao blur v;
                CmdList = mCLDB_BlurV[0];
                CmdList.BeginCommand();
                mSE_BlurV.mSRV_Src = mView_BlurH.FrameBuffer.GetSRV_RenderTarget(0);
                mView_AoMask.CookViewportMeshToPassInMultiPassMode(RHICtx, mSE_BlurV, 1, camera, mScreenAlignedTriangle);
                mView_AoMask.PushPassToRHIInMultiPassMode(CmdList, 1);
                CmdList.BeginRenderPass(mRenderPassDesc_Ao, mView_AoMask.FrameBuffer);
                CmdList.BuildRenderPass();
                CmdList.EndRenderPass();
                CmdList.EndCommand();

                //CmdList = mCLDB_BlurV[0];
                //CmdList.BeginCommand();
                //mView_BlurV.CookViewportMeshToPass(RHICtx, mSE_BlurV, camera, mScreenAlignedTriangle);
                //mView_BlurV.PushPassToRHI(CmdList);
                //CmdList.BeginRenderPass(mRenderPassDesc_Ao, mView_BlurV.FrameBuffer);
                //CmdList.BuildRenderPass(ref DPLimitter);
                //CmdList.EndRenderPass();
                //CmdList.EndCommand();
            }
            else
            {
                //ao blur v;
                var CmdList = mCLDB_BlurV[0];
                CmdList.BeginCommand();
                CmdList.BeginRenderPass(mRenderPassDesc_Ao, mView_AoMask.FrameBuffer);
                CmdList.EndRenderPass();
                CmdList.EndCommand();
                //var CmdList = mCLDB_BlurV[0];
                //CmdList.BeginCommand();
                //CmdList.BeginRenderPass(mRenderPassDesc_Ao, mView_BlurV.FrameBuffer);
                //CmdList.EndRenderPass();
                //CmdList.EndCommand();
            }
        }
Exemple #24
0
        public override async Task <bool> Init(CRenderContext RHICtx, uint width, uint height, CGfxCamera camera, IntPtr WinHandle)
        {
            await Thread.AsyncDummyClass.DummyFunc();

            mViewWidth  = width;
            mViewHeight = height;

            var viewInfo = new View.CGfxSceneViewInfo();

            viewInfo.mUseDSV = true;
            viewInfo.Width   = width;
            viewInfo.Height  = height;
            viewInfo.mDSVDesc.Init();
            viewInfo.mDSVDesc.Format = EPixelFormat.PXF_D24_UNORM_S8_UINT;
            viewInfo.mDSVDesc.Width  = width;
            viewInfo.mDSVDesc.Height = height;

            var rtDesc = new CRenderTargetViewDesc();

            rtDesc.Init();
            rtDesc.Format = EPixelFormat.PXF_R8G8B8A8_UNORM;// .PXF_R32_UINT;
            rtDesc.Width  = width;
            rtDesc.Height = height;
            viewInfo.mRTVDescArray.Add(rtDesc);
            viewInfo.mRTVDescArray.Add(rtDesc);

            mCaptureSV = new View.CGfxSceneView();
            if (false == mCaptureSV.Init(RHICtx, null, viewInfo))
            {
                return(false);
            }

            mRenderPassDesc_SceneCapture = new CRenderPassDesc();
            FrameBufferClearColor TempClearColor0 = new FrameBufferClearColor();

            TempClearColor0.r = 1.0f;
            TempClearColor0.g = 1.0f;
            TempClearColor0.b = 1.0f;
            TempClearColor0.a = 1.0f;
            FrameBufferClearColor TempClearColor1 = new FrameBufferClearColor();

            TempClearColor1.r = 0.0f;
            TempClearColor1.g = 0.0f;
            TempClearColor1.b = 0.0f;
            TempClearColor1.a = 0.0f;

            mRenderPassDesc_SceneCapture.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_SceneCapture.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_SceneCapture.mFBClearColorRT0       = TempClearColor0;
            mRenderPassDesc_SceneCapture.mFBClearColorRT1       = TempClearColor1;
            mRenderPassDesc_SceneCapture.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_SceneCapture.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_SceneCapture.mDepthClearValue       = 1.0f;
            mRenderPassDesc_SceneCapture.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_SceneCapture.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_SceneCapture.mStencilClearValue     = 0u;

            Camera = camera;
            if (mCaptureSE == null)
            {
                mCaptureSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <EnvShader.CGfxSceneCaptureSE>();
            }

            mTexData0 = new Support.CBlobObject();
            mTexData1 = new Support.CBlobObject();

            return(true);
        }
Exemple #25
0
        public async System.Threading.Tasks.Task <bool> Init(CRenderContext RHICtx)
        {
            await Thread.AsyncDummyClass.DummyFunc();

            if (mSE_SSM == null)
            {
                mSE_SSM = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxSE_SSM>();
            }

            if (mSE_SSM == null)
            {
                return(false);
            }

            CGfxSceneViewInfo ShadowMapViewInfo = new CGfxSceneViewInfo();

            ShadowMapViewInfo.mUseDSV = true;
            ShadowMapViewInfo.Width   = mResolutionX;
            ShadowMapViewInfo.Height  = mResolutionY;
            // TODO��OpenGL ES���ʹ�� D24S8��ʽ�� ����depth texture�Ľ����Զ��0�� D16��D32��ʽ����ȷ�ġ�
            ShadowMapViewInfo.mDSVDesc.Init();
            ShadowMapViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D16_UNORM;
            //ShadowMapViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D32_FLOAT;
            //ShadowMapViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D24_UNORM_S8_UINT;
            ShadowMapViewInfo.mDSVDesc.Width  = mResolutionX;
            ShadowMapViewInfo.mDSVDesc.Height = mResolutionY;

            //CRenderTargetViewDesc rtDesc0 = new CRenderTargetViewDesc();
            //rtDesc0.Init();
            //rtDesc0.Format = EPixelFormat.PXF_R8G8B8A8_UNORM;
            //rtDesc0.Width = mResolutionX;
            //rtDesc0.Height = mResolutionY;
            //ShadowMapViewInfo.mRTVDescArray.Add(rtDesc0);

            mShadowMapView = new CGfxSceneView();
            if (false == mShadowMapView.Init(RHICtx, null, ShadowMapViewInfo))
            {
                return(false);
            }

            mRenderPassDesc_SSM = new CRenderPassDesc();
            FrameBufferClearColor TempClearColor = new FrameBufferClearColor();

            TempClearColor.r = 1.0f;
            TempClearColor.g = 1.0f;
            TempClearColor.b = 1.0f;
            TempClearColor.a = 1.0f;
            mRenderPassDesc_SSM.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_SSM.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_SSM.mFBClearColorRT0       = TempClearColor;
            mRenderPassDesc_SSM.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_SSM.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_SSM.mDepthClearValue       = 1.0f;
            mRenderPassDesc_SSM.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_SSM.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_SSM.mStencilClearValue     = 0u;

            mShadowCamera = new CGfxCamera();
            if (mShadowCamera.Init(RHICtx, false) == false)
            {
                return(false);
            }
            //mShadowCamera.SetSceneView(RHICtx, mShadowMapView);

            mShadowMapView.ResizeViewport(mBorderSize, mBorderSize, mInnerResolutionY, mInnerResolutionY);

            mShadowMapSizeAndRcp.X = mResolutionX;
            mShadowMapSizeAndRcp.Y = mResolutionY;
            mShadowMapSizeAndRcp.Z = 1.0f / mResolutionX;
            mShadowMapSizeAndRcp.W = 1.0f / mResolutionY;

            //// OpenGL
            //mOrtho2UVMtx.M11 = 0.5f;
            //mOrtho2UVMtx.M22 = 0.5f;
            //mOrtho2UVMtx.M33 = 0.5f;
            //mOrtho2UVMtx.M41 = 0.5f;
            //mOrtho2UVMtx.M42 = 0.5f;
            //mOrtho2UVMtx.M43 = 0.5f;
            //mOrtho2UVMtx.M44 = 1.0f;

            if (CEngine.Instance.RenderSystem.RHIType == ERHIType.RHT_OGL)
            {
                //gles;
                mOrtho2UVMtx.M11 = 0.5f;
                mOrtho2UVMtx.M22 = 0.5f;
                mOrtho2UVMtx.M33 = 0.5f;
                mOrtho2UVMtx.M44 = 1.0f;
                mOrtho2UVMtx.M41 = 0.5f;
                mOrtho2UVMtx.M42 = 0.5f;
                mOrtho2UVMtx.M43 = 0.5f;
            }
            else
            {
                // D3D
                mOrtho2UVMtx.M11 = 0.5f;
                mOrtho2UVMtx.M22 = -0.5f;
                mOrtho2UVMtx.M33 = 1.0f;
                mOrtho2UVMtx.M44 = 1.0f;
                mOrtho2UVMtx.M41 = 0.5f;
                mOrtho2UVMtx.M42 = 0.5f;
            }


            return(true);
        }
        public void TickLogic(CRenderContext RHICtx, CGfxCamera ViewerCamera, Vector3 DirLightDir)
        {
            ViewerCamera.mShadowDistance = mShadowDistance;
            m_refViewerCamera            = ViewerCamera;
            mDirLightDirection           = DirLightDir;

            for (UInt32 CsmIdx = 0; CsmIdx < mCsmNum; CsmIdx++)
            {
                //calculate viewer camera frustum bounding sphere and shadow camera data;
                float HalfFoV = ViewerCamera.FoV * 0.5f;

                float FrustumNear = 0.0f;
                if (CsmIdx == 0)
                {
                    FrustumNear = ViewerCamera.ZNear;
                }
                else
                {
                    FrustumNear = mSumDistanceFarArray[CsmIdx - 1];
                }

                float FrustumFar    = mSumDistanceFarArray[CsmIdx];
                float FrustumLength = FrustumFar - FrustumNear;

                float TanHalfFoVHeight = (float)Math.Tan(HalfFoV);
                float TanHalfFoVWidth  = TanHalfFoVHeight * ViewerCamera.Aspect;

                float   NearHalfHeight  = FrustumNear * TanHalfFoVHeight;
                float   NearHalfWidth   = FrustumNear * TanHalfFoVWidth;
                Vector3 NearUpOffset    = NearHalfHeight * ViewerCamera.CameraData.Up;
                Vector3 NearRightOffset = NearHalfWidth * ViewerCamera.CameraData.Right;

                float   FarHalfHeight  = FrustumFar * TanHalfFoVHeight;
                float   FarHalfWidth   = FrustumFar * TanHalfFoVWidth;
                Vector3 FarUpOffset    = FarHalfHeight * ViewerCamera.CameraData.Up;
                Vector3 FarRightOffset = FarHalfWidth * ViewerCamera.CameraData.Right;

                mCSM_FrustumVtx[0] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * FrustumNear + NearRightOffset + NearUpOffset; //nrt;
                mCSM_FrustumVtx[1] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * FrustumNear + NearRightOffset - NearUpOffset; //nrb;
                mCSM_FrustumVtx[2] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * FrustumNear - NearRightOffset + NearUpOffset; //nlt;
                mCSM_FrustumVtx[3] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * FrustumNear - NearRightOffset - NearUpOffset; //nlb;
                mCSM_FrustumVtx[4] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * FrustumFar + FarRightOffset + FarUpOffset;    //frt;
                mCSM_FrustumVtx[5] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * FrustumFar + FarRightOffset - FarUpOffset;    //frb;
                mCSM_FrustumVtx[6] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * FrustumFar - FarRightOffset + FarUpOffset;    //flt;
                mCSM_FrustumVtx[7] = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * FrustumFar - FarRightOffset - FarUpOffset;    //flb;

                //Vector3 FrustumCenter = (mCSM_FrustumVtx[1] + mCSM_FrustumVtx[2] + mCSM_FrustumVtx[7] + mCSM_FrustumVtx[4]) / 4.0f;
                //Vector3 ViewerCameraPos = ViewerCamera.CameraData.Position;
                //float DistanceFrustum2Camera = Vector3.Distance(ref FrustumCenter, ref ViewerCameraPos);
                //Vector3 FrustumSphereCenter = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * DistanceFrustum2Camera;

                float   NearHalfDiagonalSqr = NearHalfWidth * NearHalfWidth + NearHalfHeight * NearHalfHeight;
                float   FarHalfDiagonalSqr  = FarHalfWidth * FarHalfWidth + FarHalfHeight * FarHalfHeight;
                float   OptimalOffset       = FrustumLength * 0.5f + (NearHalfDiagonalSqr - FarHalfDiagonalSqr) / (2.0f * FrustumLength);
                float   ViewerPosOffset     = Clamp(FrustumFar - OptimalOffset, FrustumNear, FrustumFar);
                Vector3 FrustumSphereCenter = ViewerCamera.CameraData.Position + ViewerCamera.CameraData.Direction * ViewerPosOffset;

                float FrustumSphereRadius = 1.0f;
                for (UInt32 FSR_Idx = 0; FSR_Idx < 8; FSR_Idx++)
                {
                    FrustumSphereRadius = Math.Max(FrustumSphereRadius, Vector3.DistanceSquared(FrustumSphereCenter, mCSM_FrustumVtx[FSR_Idx]));
                }
                //FrustumSphereRadius = (float)Math.Ceiling((float)Math.Sqrt(FrustumSphereRadius));
                FrustumSphereRadius = (float)Math.Sqrt(FrustumSphereRadius);

                Vector3 ShadowCameraPos = FrustumSphereCenter - mDirLightDirection * (FrustumSphereRadius + mShadowCameraOffset);

                mShadowCameraArray[CsmIdx].LookAtLH(ShadowCameraPos, FrustumSphereCenter, Vector3.UnitY, true);
                float FrustumSphereDiameter = FrustumSphereRadius * 2.0f;
                float ShadowCameraZFar      = mShadowCameraOffset + FrustumSphereDiameter;
                float ShadowCameraZNear     = 0.0f;
                mShadowCameraArray[CsmIdx].MakeOrtho(FrustumSphereDiameter, FrustumSphereDiameter, ShadowCameraZNear, ShadowCameraZFar);

                Vector4 WorldCenterNDC       = Vector4.Transform(new Vector4(0.0f, 0.0f, 0.0f, 1.0f), mShadowCameraArray[CsmIdx].CameraData.ViewProjection);
                float   TexelPosX            = (WorldCenterNDC.X * 0.5f + 0.5f) * mInnerResolutionX;
                float   TexelPosAdjustedNdcX = ((float)Math.Floor(TexelPosX) / mInnerResolutionX - 0.5f) / 0.5f;
                float   TexelOffsetNdcX      = TexelPosAdjustedNdcX - WorldCenterNDC.X;
                float   TexelPosY            = (WorldCenterNDC.Y * (-0.5f) + 0.5f) * mInnerResolutionY;
                float   TexelPosAdjustedNdcY = ((float)Math.Floor(TexelPosY) / mInnerResolutionY - 0.5f) / (-0.5f);
                float   TexelOffsetNdcY      = TexelPosAdjustedNdcY - WorldCenterNDC.Y;
                mShadowCameraArray[CsmIdx].DoOrthoProjectionForShadow(FrustumSphereDiameter, FrustumSphereDiameter, ShadowCameraZNear, ShadowCameraZFar, TexelOffsetNdcX, TexelOffsetNdcY);

                //data for other code to use;
                {
                    mViewer2ShadowMtxArray[CsmIdx] = mShadowCameraArray[CsmIdx].CameraData.ViewProjection * mOrtho2UVMtx * mUVAdjustedMtxArray[CsmIdx];

                    float UniformDepthBias      = 2.0f;
                    float PerObjCustomDepthBias = 1.0f;
                    float DepthBiasClipSpace    = UniformDepthBias / (ShadowCameraZFar - ShadowCameraZNear) * (FrustumSphereDiameter / mInnerResolutionY) * PerObjCustomDepthBias;
                    //mShadowMapView.mDepthBiasAndZFarRcp = new Vector2(DepthBiasClipSpace, 1.0f / ShadowCameraZFar);
                    mShadowMapView.mDepthBiasAndZFarRcp = new Vector2(0.0f, 1.0f / ShadowCameraZFar);

                    mShadowTransitionScaleArray[CsmIdx] = 1.0f / (DepthBiasClipSpace + 0.00001f);

                    float FadeStartDistance = mShadowDistance - mShadowDistance * mFadeStrength;
                    mFadeParam.X = 1.0f / (mShadowDistance - FadeStartDistance + 0.0001f);
                    mFadeParam.Y = -FadeStartDistance * mFadeParam.X;
                }

                ViewerCamera.PushVisibleMesh2ShadowLayer(mShadowCameraArray[CsmIdx].CullingFrustum);

                mShadowMapView.ResizeViewport(mResolutionX * CsmIdx + mBorderSize, mBorderSize, mInnerResolutionY, mInnerResolutionY);
                mShadowMapView.CookShadowLayerData2Pass(RHICtx, m_refViewerCamera, mShadowCameraArray[CsmIdx], mSE_CSMMobile);
                var CmdList = mCmdListDB_Shadow[CsmIdx, 0];
                mShadowMapView.PushSpecRenderLayerDataToRHI(CmdList, ERenderLayer.RL_Shadow);

                CmdList.BeginCommand();
                CmdList.BeginRenderPass(mRenderPassDesc_CSM[CsmIdx], mShadowMapView.FrameBuffer);
                CmdList.BuildRenderPass(DPLimitter);
                CmdList.EndRenderPass();
                CmdList.EndCommand();

                ViewerCamera.ClearSpecRenderLayerData(ERenderLayer.RL_Shadow);

                DrawCall     = CmdList.DrawCall;
                DrawTriangle = CmdList.DrawTriangle;
            }

            mShadowTransitionScaleVec.X = mShadowTransitionScaleArray[0];
            mShadowTransitionScaleVec.Y = mShadowTransitionScaleArray[1];
            mShadowTransitionScaleVec.Z = mShadowTransitionScaleArray[2];
            mShadowTransitionScaleVec.W = mShadowTransitionScaleArray[3];
        }
        public async System.Threading.Tasks.Task <bool> Init(CRenderContext RHICtx)
        {
            await Thread.AsyncDummyClass.DummyFunc();

            if (mSE_CSMMobile == null)
            {
                mSE_CSMMobile = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxSE_SSM>();
            }

            if (mSE_CSMMobile == null)
            {
                return(false);
            }

            mWholeReslutionX = mResolutionX * mCsmNum;
            mWholeReslutionY = mResolutionY;

            CGfxSceneViewInfo ShadowMapViewInfo = new CGfxSceneViewInfo();

            ShadowMapViewInfo.mUseDSV = true;
            ShadowMapViewInfo.Width   = mWholeReslutionX;
            ShadowMapViewInfo.Height  = mWholeReslutionY;
            ShadowMapViewInfo.mDSVDesc.Init();
            ShadowMapViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D16_UNORM;
            ShadowMapViewInfo.mDSVDesc.Width  = mWholeReslutionX;
            ShadowMapViewInfo.mDSVDesc.Height = mWholeReslutionY;
            mShadowMapView = new CGfxSceneView();
            if (false == mShadowMapView.Init(RHICtx, null, ShadowMapViewInfo))
            {
                return(false);
            }

            mRenderPassDesc_CSM = new CRenderPassDesc[4];
            FrameBufferClearColor TempClearColor = new FrameBufferClearColor();

            TempClearColor.r = 1.0f;
            TempClearColor.g = 1.0f;
            TempClearColor.b = 1.0f;
            TempClearColor.a = 1.0f;
            mRenderPassDesc_CSM[0].mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_CSM[0].mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_CSM[0].mFBClearColorRT0       = TempClearColor;
            mRenderPassDesc_CSM[0].mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_CSM[0].mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_CSM[0].mDepthClearValue       = 1.0f;
            mRenderPassDesc_CSM[0].mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_CSM[0].mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_CSM[0].mStencilClearValue     = 0u;

            for (UInt32 RPDIdx = 1; RPDIdx < 4; RPDIdx++)
            {
                mRenderPassDesc_CSM[RPDIdx].mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionLoad;
                mRenderPassDesc_CSM[RPDIdx].mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
                mRenderPassDesc_CSM[RPDIdx].mFBClearColorRT0       = TempClearColor;
                mRenderPassDesc_CSM[RPDIdx].mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionLoad;
                mRenderPassDesc_CSM[RPDIdx].mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
                mRenderPassDesc_CSM[RPDIdx].mDepthClearValue       = 1.0f;
                mRenderPassDesc_CSM[RPDIdx].mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionLoad;
                mRenderPassDesc_CSM[RPDIdx].mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
                mRenderPassDesc_CSM[RPDIdx].mStencilClearValue     = 0u;
            }

            mShadowCameraArray = new CGfxCamera[4];
            for (UInt32 CamIdx = 0; CamIdx < 4; CamIdx++)
            {
                mShadowCameraArray[CamIdx] = new CGfxCamera();
                if (mShadowCameraArray[CamIdx].Init(RHICtx, false) == false)
                {
                    return(false);
                }
            }

            mShadowMapView.ResizeViewport(mBorderSize, mBorderSize, mInnerResolutionY, mInnerResolutionY);

            mShadowMapSizeAndRcp.X = mWholeReslutionX;
            mShadowMapSizeAndRcp.Y = mWholeReslutionY;
            mShadowMapSizeAndRcp.Z = 1.0f / mWholeReslutionX;
            mShadowMapSizeAndRcp.W = 1.0f / mWholeReslutionY;

            if (CEngine.Instance.RenderSystem.RHIType == ERHIType.RHT_OGL)
            {
                //gles;
                mOrtho2UVMtx.M11 = 0.5f;
                mOrtho2UVMtx.M22 = 0.5f;
                mOrtho2UVMtx.M33 = 0.5f;
                mOrtho2UVMtx.M44 = 1.0f;
                mOrtho2UVMtx.M41 = 0.5f;
                mOrtho2UVMtx.M42 = 0.5f;
                mOrtho2UVMtx.M43 = 0.5f;
            }
            else
            {
                // D3D
                mOrtho2UVMtx.M11 = 0.5f;
                mOrtho2UVMtx.M22 = -0.5f;
                mOrtho2UVMtx.M33 = 1.0f;
                mOrtho2UVMtx.M44 = 1.0f;
                mOrtho2UVMtx.M41 = 0.5f;
                mOrtho2UVMtx.M42 = 0.5f;
            }

            for (UInt32 UVAdjustIdx = 0; UVAdjustIdx < mCsmNum; UVAdjustIdx++)
            {
                mUVAdjustedMtxArray[UVAdjustIdx].M11 = (float)mInnerResolutionX / (float)mWholeReslutionX;
                mUVAdjustedMtxArray[UVAdjustIdx].M22 = (float)mInnerResolutionY / (float)mWholeReslutionY;
                mUVAdjustedMtxArray[UVAdjustIdx].M33 = 1.0f;
                mUVAdjustedMtxArray[UVAdjustIdx].M44 = 1.0f;
                mUVAdjustedMtxArray[UVAdjustIdx].M41 = (float)(mResolutionX * UVAdjustIdx + mBorderSize) / (float)mWholeReslutionX;
                mUVAdjustedMtxArray[UVAdjustIdx].M42 = (float)mBorderSize / (float)mWholeReslutionY;
            }

            mCsmDistanceArray[0] = mShadowDistance * 0.08f;
            mCsmDistanceArray[1] = mShadowDistance * 0.15f;
            mCsmDistanceArray[2] = mShadowDistance * 0.30f;
            mCsmDistanceArray[3] = mShadowDistance * 0.47f;

            mSumDistanceFarArray[0] = mCsmDistanceArray[0];
            mSumDistanceFarArray[1] = mCsmDistanceArray[0] + mCsmDistanceArray[1];
            mSumDistanceFarArray[2] = mCsmDistanceArray[0] + mCsmDistanceArray[1] + mCsmDistanceArray[2];
            mSumDistanceFarArray[3] = mCsmDistanceArray[0] + mCsmDistanceArray[1] + mCsmDistanceArray[2] + mCsmDistanceArray[3];

            mSumDistanceFarVec.X = mSumDistanceFarArray[0];
            mSumDistanceFarVec.Y = mSumDistanceFarArray[1];
            mSumDistanceFarVec.Z = mSumDistanceFarArray[2];
            mSumDistanceFarVec.W = mSumDistanceFarArray[3];

            return(true);
        }
Exemple #28
0
        public bool Init(UInt32 width, UInt32 height, CGfxCamera camera)
        {
            var RHICtx = EngineNS.CEngine.Instance.RenderContext;

            mViewportSizeX = width;
            mViewportSizeY = height;

            //hit proxy view;
            CGfxSceneViewInfo HitProxyViewInfo = new CGfxSceneViewInfo();

            HitProxyViewInfo.mUseDSV = true;
            HitProxyViewInfo.Width   = width;
            HitProxyViewInfo.Height  = height;
            HitProxyViewInfo.mDSVDesc.Init();
            HitProxyViewInfo.mDSVDesc.Format = EngineNS.EPixelFormat.PXF_D24_UNORM_S8_UINT;
            HitProxyViewInfo.mDSVDesc.Width  = width;
            HitProxyViewInfo.mDSVDesc.Height = height;

            CRenderTargetViewDesc rtDesc0 = new CRenderTargetViewDesc();

            rtDesc0.Init();
            rtDesc0.Format = EPixelFormat.PXF_R8G8B8A8_UNORM;
            rtDesc0.Width  = width;
            rtDesc0.Height = height;
            HitProxyViewInfo.mRTVDescArray.Add(rtDesc0);

            mHitProxyView = new CGfxSceneView();
            if (false == mHitProxyView.Init(RHICtx, null, HitProxyViewInfo))
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"HitProxyError!!!", "");
                return(false);
            }

            mCamera = camera;

            mRenderPassDesc_HitProxy = new CRenderPassDesc();
            FrameBufferClearColor TempClearColor = new FrameBufferClearColor();

            TempClearColor.r = 0.0f;
            TempClearColor.g = 0.0f;
            TempClearColor.b = 0.0f;
            TempClearColor.a = 0.0f;
            mRenderPassDesc_HitProxy.mFBLoadAction_Color    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_HitProxy.mFBStoreAction_Color   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_HitProxy.mFBClearColorRT0       = TempClearColor;
            mRenderPassDesc_HitProxy.mFBLoadAction_Depth    = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_HitProxy.mFBStoreAction_Depth   = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_HitProxy.mDepthClearValue       = 1.0f;
            mRenderPassDesc_HitProxy.mFBLoadAction_Stencil  = FrameBufferLoadAction.LoadActionClear;
            mRenderPassDesc_HitProxy.mFBStoreAction_Stencil = FrameBufferStoreAction.StoreActionStore;
            mRenderPassDesc_HitProxy.mStencilClearValue     = 0u;

            if (mHitProxySE == null)
            {
                mHitProxySE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxHitProxySE>();
            }
            if (mHitProxySE == null)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"HitProxyError!!!", "");
                return(false);
            }

            if (mHitProxyAxisSE == null)
            {
                mHitProxyAxisSE = CEngine.Instance.ShadingEnvManager.GetGfxShadingEnv <CGfxHitProxyAxisSE>();
            }
            if (mHitProxyAxisSE == null)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"HitProxyError!!!", "");
                return(false);
            }

            mHitProxyCPUTexture = new CBlobObject();
            return(true);
        }
        public void TickLogic(CRenderContext RHICtx, CGfxCamera camera)
        {
            if (CEngine.EnableBloom == false)
            {
                return;
            }
            if (RHICtx == null)
            {
                Profiler.Log.WriteLine(Profiler.ELogTag.Error, "@Graphic", $"BloomError!!!", "");
                return;
            }

            ScopeTickLogic.Begin();
            //blur h pass
            var CmdList = mCmdListDB_Bloom[0];

            CmdList.BeginCommand();
            CmdList.BeginRenderPass(mRenderPassDesc_Bloom, mView_BlurH8.FrameBuffer);
            mView_BlurH8.CookViewportMeshToPass(RHICtx, mSE_BlurH, camera, mScreenAlignedTriangle);
            mView_BlurH8.PushPassToRHI(CmdList);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            //blur v pass
            CmdList.BeginRenderPass(mRenderPassDesc_Bloom, mView_BlurV8.FrameBuffer);
            mView_BlurV8.CookViewportMeshToPass(RHICtx, mSE_BlurV, camera, mScreenAlignedTriangle);
            mView_BlurV8.PushPassToRHI(CmdList);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            //d16 pass
            CmdList.BeginRenderPass(mRenderPassDesc_Bloom, mDSView16.FrameBuffer);
            mDownSampSE.mSrcTex = mView_BlurV8.FrameBuffer.GetSRV_RenderTarget(0);
            mDSView16.CookViewportMeshToPass(RHICtx, mDownSampSE, camera, mScreenAlignedTriangle);
            mDSView16.PushPassToRHI(CmdList);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            //d32 pass
            CmdList.BeginRenderPass(mRenderPassDesc_Bloom, mDSView32.FrameBuffer);
            mDownSampSE.mSrcTex = mDSView16.FrameBuffer.GetSRV_RenderTarget(0);
            mDSView32.CookViewportMeshToPass(RHICtx, mDownSampSE, camera, mScreenAlignedTriangle);
            mDSView32.PushPassToRHI(CmdList);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            //d64 pass
            CmdList.BeginRenderPass(mRenderPassDesc_Bloom, mDSView64.FrameBuffer);
            mDownSampSE.mSrcTex = mDSView32.FrameBuffer.GetSRV_RenderTarget(0);
            mDSView64.CookViewportMeshToPass(RHICtx, mDownSampSE, camera, mScreenAlignedTriangle);
            mDSView64.PushPassToRHI(CmdList);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            //u32 pass
            CmdList.BeginRenderPass(mRenderPassDesc_Bloom, mUSView32.FrameBuffer);
            mUpSampSE.mSrcTexUp   = mDSView32.FrameBuffer.GetSRV_RenderTarget(0);
            mUpSampSE.mSrcTexDown = mDSView64.FrameBuffer.GetSRV_RenderTarget(0);
            mUSView32.CookViewportMeshToPass(RHICtx, mUpSampSE, camera, mScreenAlignedTriangle);
            mUSView32.PushPassToRHI(CmdList);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            //u16 pass
            CmdList.BeginRenderPass(mRenderPassDesc_Bloom, mUSView16.FrameBuffer);
            mUpSampSE.mSrcTexUp   = mDSView16.FrameBuffer.GetSRV_RenderTarget(0);
            mUpSampSE.mSrcTexDown = mUSView32.FrameBuffer.GetSRV_RenderTarget(0);
            mUSView16.CookViewportMeshToPass(RHICtx, mUpSampSE, camera, mScreenAlignedTriangle);
            mUSView16.PushPassToRHI(CmdList);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            //u8 pass
            CmdList.BeginRenderPass(mRenderPassDesc_Bloom, mUSView8.FrameBuffer);
            mUpSampSE.mSrcTexUp   = mView_BlurV8.FrameBuffer.GetSRV_RenderTarget(0);
            mUpSampSE.mSrcTexDown = mUSView16.FrameBuffer.GetSRV_RenderTarget(0);
            mUSView8.CookViewportMeshToPass(RHICtx, mUpSampSE, camera, mScreenAlignedTriangle);
            mUSView8.PushPassToRHI(CmdList);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();
            CmdList.EndCommand();

            ScopeTickLogic.End();
        }
Exemple #30
0
        private void TickLogic_Impl(CRenderContext RHICtx, CGfxCamera camera, Vector3 SunDir, CGfxSceneView BaseSceneView)
        {
            if (CEngine.EnableSunShaft == false)
            {
                mStopSunShaftUpdate = true;
                return;
            }
            if (RHICtx == null)
            {
                return;
            }

            ScopeTickLogic.Begin();
            mSunPosNdc.X = -SunDir.X * mSunDistance;
            mSunPosNdc.Y = -SunDir.Y * mSunDistance;
            mSunPosNdc.Z = -SunDir.Z * mSunDistance;
            mSunPosNdc.W = 1.0f;

            mSunPosNdc   = Vector4.Transform(mSunPosNdc, camera.CameraData.ViewProjection);
            mSunPosNdc.X = Clamp(mSunPosNdc.X / mSunPosNdc.W, mSunPosNdcMin, mSunPosNdcMax);
            mSunPosNdc.Y = Clamp(mSunPosNdc.Y / mSunPosNdc.W, mSunPosNdcMin, mSunPosNdcMax);
            float AttenOffset = Clamp(Math.Abs(mSunPosNdc.X) - 1.0f, 0.0f, 0.5f) + Clamp(Math.Abs(mSunPosNdc.Y) - 1.0f, 0.0f, 0.5f);

            mSunShaftAtten = Clamp(Vector3.Dot(-1.0f * camera.CameraData.Direction, SunDir) * 2.0f - AttenOffset, 0.0f, 1.0f);
            if (mSunShaftAtten <= 0.0f)
            {
                mStopSunShaftUpdate = true;
                return;
            }
            else
            {
                mStopSunShaftUpdate = false;
            }

            if (CEngine.Instance.RenderSystem.RHIType != ERHIType.RHT_OGL)
            {
                mSunPosNdc.W = 1.0f;
            }
            else
            {
                mSunPosNdc.W = -1.0f;
            }

            var CmdList = mCLDB_SunShaft[0];

            CmdList.BeginCommand();
            //generate mask;
            mSE_Mask.mBaseSceneView = BaseSceneView.FrameBuffer.GetSRV_RenderTarget(0);
            mView_Mask.CookViewportMeshToPassInMultiPassMode(RHICtx, mSE_Mask, 0, camera, mViewportMesh);
            mView_Mask.PushPassToRHIInMultiPassMode(CmdList, 0);
            CmdList.BeginRenderPass(mRenderPassDesc_SunShaft, mView_Mask.FrameBuffer);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            //blur0;
            mSunPosNdc.Z           = 0.2f;
            mView_Blur.SunPosNDC   = mSunPosNdc;
            mSE_Blur.mSunShaftMask = mView_Mask.FrameBuffer.GetSRV_RenderTarget(0);
            mView_Blur.CookViewportMeshToPassInMultiPassMode(RHICtx, mSE_Blur, 0, camera, mViewportMesh);
            mView_Blur.PushPassToRHIInMultiPassMode(CmdList, 0);
            CmdList.BeginRenderPass(mRenderPassDesc_SunShaft, mView_Blur.FrameBuffer);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            CmdList.EndCommand();

            CmdList = mCLDB_DisableWarning0[0];
            CmdList.BeginCommand();
            //blur1;
            mSunPosNdc.Z           = 0.4f;
            mView_Mask.SunPosNDC   = mSunPosNdc;
            mSE_Blur.mSunShaftMask = mView_Blur.FrameBuffer.GetSRV_RenderTarget(0);
            mView_Mask.CookViewportMeshToPassInMultiPassMode(RHICtx, mSE_Blur, 1, camera, mViewportMesh);
            mView_Mask.PushPassToRHIInMultiPassMode(CmdList, 1);
            CmdList.BeginRenderPass(mRenderPassDesc_SunShaft, mView_Mask.FrameBuffer);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            CmdList.EndCommand();

            CmdList = mCLDB_DisableWarning1[0];
            CmdList.BeginCommand();
            //blur2;
            mSunPosNdc.Z           = 0.7f;
            mView_Blur.SunPosNDC   = mSunPosNdc;
            mSE_Blur.mSunShaftMask = mView_Mask.FrameBuffer.GetSRV_RenderTarget(0);
            mView_Blur.CookViewportMeshToPassInMultiPassMode(RHICtx, mSE_Blur, 1, camera, mViewportMesh);
            mView_Blur.PushPassToRHIInMultiPassMode(CmdList, 1);
            CmdList.BeginRenderPass(mRenderPassDesc_SunShaft, mView_Blur.FrameBuffer);
            CmdList.BuildRenderPass();
            CmdList.EndRenderPass();

            CmdList.EndCommand();

            ScopeTickLogic.End();
        }