Example #1
0
        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);
            });
        }
Example #5
0
        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);
                        }
                    }
                }
            });
        }