void RenderPresentView(Camera RenderCamera, RDGTextureRef SourceTexture, RenderTexture DestTexture) { // AddPass GraphBuilder.AddRenderPass <PresentViewData>("PresentView", ProfilingSampler.Get(CustomSamplerId.PresentView), (ref PresentViewData PassData, ref RDGPassBuilder PassBuilder) => { PassData.CameraSize = new float2(RenderCamera.pixelWidth, RenderCamera.pixelHeight); PassData.RT_Source = PassBuilder.ReadTexture(SourceTexture); PassData.RT_Dest = new RenderTargetIdentifier(DestTexture); }, (ref PresentViewData PassData, RDGContext GraphContext) => { RenderTexture RT_Source = PassData.RT_Source; /*float4 ScaleBias = new float4(PassData.CameraSize.x / RT_Source.width, PassData.CameraSize.y / RT_Source.height, 0.0f, 0.0f); * if (DestTexture == null) { * ScaleBias.w = ScaleBias.y; * ScaleBias.y *= -1; * }*/ float4 ScaleBias = new float4(1, 1, 0.0f, 0.0f); if (DestTexture == null) { ScaleBias.y *= -1; } GraphContext.CmdBuffer.SetGlobalVector(InfinityShaderIDs.BlitScaleBias, ScaleBias); GraphContext.CmdBuffer.DrawFullScreen(RT_Source, PassData.RT_Dest, 1); }); }
void RenderOpaqueDepth(Camera RenderCamera, FCullingData CullingData, CullingResults CullingResult) { //Request Resource RendererList RenderList = RendererList.Create(CreateRendererListDesc(CullingResult, RenderCamera, InfinityPassIDs.OpaqueDepth, new RenderQueueRange(2450, 2999))); RDGTextureDesc DepthDesc = new RDGTextureDesc(Screen.width, Screen.height) { clearBuffer = true, dimension = TextureDimension.Tex2D, enableMSAA = false, bindTextureMS = false, name = "DepthTexture", depthBufferBits = EDepthBits.Depth32 }; RDGTextureRef DepthTexture = GraphBuilder.ScopeTexture(InfinityShaderIDs.DepthBuffer, DepthDesc); //Add OpaqueDepthPass GraphBuilder.AddPass <FOpaqueDepthData>("OpaqueDepth", ProfilingSampler.Get(CustomSamplerId.OpaqueDepth), (ref FOpaqueDepthData PassData, ref RDGPassBuilder PassBuilder) => { PassData.RendererList = RenderList; PassData.DepthBuffer = PassBuilder.UseDepthBuffer(DepthTexture, EDepthAccess.ReadWrite); DepthPassMeshProcessor.DispatchGather(CullingData, new FMeshPassDesctiption(2450, 2999)); }, (ref FOpaqueDepthData PassData, RDGContext GraphContext) => { RendererList DepthRenderList = PassData.RendererList; DepthRenderList.drawSettings.sortingSettings = new SortingSettings(RenderCamera) { criteria = SortingCriteria.QuantizedFrontToBack }; DepthRenderList.drawSettings.enableInstancing = RenderPipelineAsset.EnableInstanceBatch; DepthRenderList.drawSettings.enableDynamicBatching = RenderPipelineAsset.EnableDynamicBatch; DepthRenderList.filteringSettings.renderQueueRange = new RenderQueueRange(2450, 2999); GraphContext.RenderContext.DrawRenderers(DepthRenderList.cullingResult, ref DepthRenderList.drawSettings, ref DepthRenderList.filteringSettings); //MeshDrawPipeline DepthPassMeshProcessor.DispatchDraw(GraphContext, 1); }); }
void RenderOpaqueMotion(Camera RenderCamera, CullingResults CullingData) { RenderCamera.depthTextureMode |= DepthTextureMode.MotionVectors | DepthTextureMode.Depth; //Request Resource RendererList RenderList = RendererList.Create(CreateRendererListDesc(CullingData, RenderCamera, InfinityPassIDs.OpaqueMotion)); RDGTextureRef DepthTexture = GraphBuilder.ScopeTexture(InfinityShaderIDs.RT_DepthBuffer); RDGTextureDesc MotionDesc = new RDGTextureDesc(RenderCamera.pixelWidth, RenderCamera.pixelHeight) { clearBuffer = true, dimension = TextureDimension.Tex2D, clearColor = Color.clear, enableMSAA = false, bindTextureMS = false, name = "MotionBufferTexture", colorFormat = GraphicsFormat.R16G16_SFloat }; RDGTextureRef MotionTexture = GraphBuilder.CreateTexture(MotionDesc, InfinityShaderIDs.RT_MotionBuffer); GraphBuilder.ScopeTexture(InfinityShaderIDs.RT_MotionBuffer, MotionTexture); //Add RenderPass GraphBuilder.AddRenderPass <FOpaqueMotionData>("OpaqueMotion", ProfilingSampler.Get(CustomSamplerId.OpaqueMotion), (ref FOpaqueMotionData PassData, ref RDGPassBuilder PassBuilder) => { PassData.RendererList = RenderList; PassData.MotionBuffer = PassBuilder.UseColorBuffer(MotionTexture, 0); PassData.DepthBuffer = PassBuilder.UseDepthBuffer(DepthTexture, EDepthAccess.Read); }, (ref FOpaqueMotionData PassData, RDGContext GraphContext) => { RendererList MotionRenderList = PassData.RendererList; MotionRenderList.drawSettings.sortingSettings = new SortingSettings(RenderCamera) { criteria = SortingCriteria.CommonOpaque }; MotionRenderList.drawSettings.perObjectData = PerObjectData.MotionVectors; MotionRenderList.drawSettings.enableInstancing = RenderPipelineAsset.EnableInstanceBatch; MotionRenderList.drawSettings.enableDynamicBatching = RenderPipelineAsset.EnableDynamicBatch; MotionRenderList.filteringSettings.renderQueueRange = RenderQueueRange.opaque; MotionRenderList.filteringSettings.excludeMotionVectorObjects = false; GraphContext.RenderContext.DrawRenderers(MotionRenderList.cullingResult, ref MotionRenderList.drawSettings, ref MotionRenderList.filteringSettings); }); }
void RenderPresentView(Camera RenderCamera, RDGTextureRef SourceTexture, RenderTexture DestTexture) { // Add PresentPass GraphBuilder.AddPass <PresentViewData>("Present", ProfilingSampler.Get(CustomSamplerId.Present), (ref PresentViewData PassData, ref RDGPassBuilder PassBuilder) => { PassData.SrcBuffer = PassBuilder.ReadTexture(SourceTexture); PassData.DestBuffer = new RenderTargetIdentifier(DestTexture); }, (ref PresentViewData PassData, RDGContext GraphContext) => { RenderTexture SrcBuffer = PassData.SrcBuffer; float4 ScaleBias = new float4((float)RenderCamera.pixelWidth / (float)SrcBuffer.width, (float)RenderCamera.pixelHeight / (float)SrcBuffer.height, 0.0f, 0.0f); if (DestTexture == null) { ScaleBias.w = ScaleBias.y; ScaleBias.y *= -1; } GraphContext.CmdBuffer.SetGlobalVector(InfinityShaderIDs.ScaleBias, ScaleBias); GraphContext.CmdBuffer.DrawFullScreen(GraphicsUtility.GetViewport(RenderCamera), PassData.SrcBuffer, PassData.DestBuffer, 1); }); }
void RenderOpaqueGBuffer(Camera RenderCamera, CullingResults CullingData, NativeArray <FVisibleMeshBatch> VisibleMeshBatchList) { //Request Resource RendererList RenderList = RendererList.Create(CreateRendererListDesc(CullingData, RenderCamera, InfinityPassIDs.OpaqueGBuffer)); RDGTextureRef DepthTexture = GraphBuilder.ScopeTexture(InfinityShaderIDs.RT_DepthBuffer); RDGTextureDesc GBufferDescA = new RDGTextureDesc(RenderCamera.pixelWidth, RenderCamera.pixelHeight) { clearBuffer = true, clearColor = Color.clear, dimension = TextureDimension.Tex2D, enableMSAA = false, bindTextureMS = false, name = "GBufferATexture", colorFormat = GraphicsFormat.R16G16B16A16_UNorm }; RDGTextureDesc GBufferDescB = new RDGTextureDesc(RenderCamera.pixelWidth, RenderCamera.pixelHeight) { clearBuffer = true, clearColor = Color.clear, dimension = TextureDimension.Tex2D, enableMSAA = false, bindTextureMS = false, name = "GBufferBTexture", colorFormat = GraphicsFormat.A2B10G10R10_UIntPack32 }; RDGTextureRef GBufferTextureA = GraphBuilder.CreateTexture(GBufferDescA, InfinityShaderIDs.RT_ThinGBufferA); RDGTextureRef GBufferTextureB = GraphBuilder.CreateTexture(GBufferDescB, InfinityShaderIDs.RT_ThinGBufferB); GraphBuilder.ScopeTexture(InfinityShaderIDs.RT_ThinGBufferA, GBufferTextureA); GraphBuilder.ScopeTexture(InfinityShaderIDs.RT_ThinGBufferB, GBufferTextureB); //Add RenderPass GraphBuilder.AddRenderPass <FOpaqueGBufferData>("OpaqueGBuffer", ProfilingSampler.Get(CustomSamplerId.OpaqueGBuffer), (ref FOpaqueGBufferData PassData, ref RDGPassBuilder PassBuilder) => { PassData.RendererList = RenderList; PassData.GBufferA = PassBuilder.UseColorBuffer(GBufferTextureA, 0); PassData.GBufferB = PassBuilder.UseColorBuffer(GBufferTextureB, 1); PassData.DepthBuffer = PassBuilder.UseDepthBuffer(DepthTexture, EDepthAccess.ReadWrite); }, (ref FOpaqueGBufferData PassData, RDGContext GraphContext) => { //Draw UnityRenderer RendererList GBufferRenderList = PassData.RendererList; GBufferRenderList.drawSettings.perObjectData = PerObjectData.Lightmaps; GBufferRenderList.drawSettings.enableInstancing = RenderPipelineAsset.EnableInstanceBatch; GBufferRenderList.drawSettings.enableDynamicBatching = RenderPipelineAsset.EnableDynamicBatch; GBufferRenderList.filteringSettings.renderQueueRange = new RenderQueueRange(0, 2450); GraphContext.RenderContext.DrawRenderers(GBufferRenderList.cullingResult, ref GBufferRenderList.drawSettings, ref GBufferRenderList.filteringSettings); //Draw CustomRenderer RenderWorld World = GraphContext.World; NativeList <FMeshBatch> MeshBatchList = World.GetMeshBatchColloctor().GetMeshBatchList(); if (VisibleMeshBatchList.Length == 0) { return; } for (int i = 0; i < VisibleMeshBatchList.Length; i++) { FVisibleMeshBatch VisibleMeshBatch = VisibleMeshBatchList[i]; if (VisibleMeshBatch.visible) { FMeshBatch MeshBatch = MeshBatchList[VisibleMeshBatch.index]; Mesh mesh = World.WorldMeshList.Get(MeshBatch.Mesh); Material material = World.WorldMaterialList.Get(MeshBatch.Material); if (mesh && material) { GraphContext.CmdBuffer.DrawMesh(mesh, MeshBatch.Matrix_LocalToWorld, material, MeshBatch.SubmeshIndex, 2); } } } }); }