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); } }
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); } } }
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); } }
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); }
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); } }
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; }
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; } }
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(); }
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); }
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); }
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; }
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; }
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); }
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); }
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); }
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(); } }
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); }
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); }
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(); }
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(); }