Пример #1
0
        static public void RenderNormals(ScriptableRenderContext renderContext, CullingResults cullResults, DrawingSettings drawSettings, FilteringSettings filterSettings)
        {
            var cmd = CommandBufferPool.Get("Clear Normals");

            cmd.SetRenderTarget(s_NormalsTarget.Identifier());
            cmd.ClearRenderTarget(true, true, k_NormalClearColor);
            renderContext.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);

            drawSettings.SetShaderPassName(0, k_NormalsRenderingPassName);
            renderContext.DrawRenderers(cullResults, ref drawSettings, ref filterSettings);
        }
        /// <inheritdoc/>
        public override void Execute(ScriptableRenderer renderer, ScriptableRenderContext context, ref RenderingData renderingData)
        {
            if (renderer == null)
            {
                throw new ArgumentNullException(nameof(renderer));
            }

            CommandBuffer cmd = CommandBufferPool.Get(k_PostProcessingTag);

            var layer = renderingData.cameraData.postProcessLayer;
            int effectsCount;

            if (opaquePost)
            {
                effectsCount = layer.sortedBundles[PostProcessEvent.BeforeTransparent].Count;
            }
            else
            {
                effectsCount = layer.sortedBundles[PostProcessEvent.BeforeStack].Count +
                               layer.sortedBundles[PostProcessEvent.AfterStack].Count;
            }

            // If there's only one effect in the stack and soure is same as dest we
            // create an intermediate blit rendertarget to handle it.
            // Otherwise, PostProcessing system will create the intermediate blit targets itself.
            if (effectsCount == 1 && source.id == destination.id)
            {
                m_ReleaseTemporaryRenderTexture = true;
                cmd.GetTemporaryRT(m_TemporaryColorTexture.id, descriptor, FilterMode.Point);
                renderer.RenderPostProcess(cmd, ref renderingData.cameraData, descriptor.colorFormat, source.Identifier(), m_TemporaryColorTexture.Identifier(), opaquePost, flip);
                cmd.Blit(m_TemporaryColorTexture.Identifier(), source.Identifier());
            }
            else
            {
                renderer.RenderPostProcess(cmd, ref renderingData.cameraData, descriptor.colorFormat, source.Identifier(), destination.Identifier(), opaquePost, flip);
            }

            context.ExecuteCommandBuffer(cmd);
            CommandBufferPool.Release(cmd);
        }
Пример #3
0
        public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData)
        {
            SortingCriteria sortingCriteria = (renderQueueType == RenderQueueType.Transparent)
                ? SortingCriteria.CommonTransparent
                : renderingData.cameraData.defaultOpaqueSortFlags;

            DrawingSettings drawingSettings = CreateDrawingSettings(m_ShaderTagIdList, ref renderingData, sortingCriteria);

            drawingSettings.overrideMaterial          = overrideMaterial;
            drawingSettings.overrideMaterialPassIndex = overrideMaterialPassIndex;

            Camera originalCamera = renderingData.cameraData.camera;
            Camera rtCamera       = m_CameraSettings.camera;

            if (rtCamera != null && rtCamera.targetTexture != null)
            {
                float         originalCameraAspect = (float)originalCamera.pixelWidth / (float)originalCamera.pixelHeight;
                float         rtCameraAspect       = (float)rtCamera.pixelWidth / (float)rtCamera.pixelHeight;
                CommandBuffer cmd = CommandBufferPool.Get(m_ProfilerTag);
                using (new ProfilingSample(cmd, m_ProfilerTag))
                {
                    context.ExecuteCommandBuffer(cmd);
                    cmd.Clear();

                    Matrix4x4 rtProjectionMatrix;
                    if (!rtCamera.orthographic)
                    {
                        rtProjectionMatrix = Matrix4x4.Perspective(rtCamera.fieldOfView, rtCameraAspect,
                                                                   rtCamera.nearClipPlane, rtCamera.farClipPlane);
                    }
                    else
                    {
                        float vertical   = rtCamera.orthographicSize;
                        float horizontal = vertical * rtCamera.aspect;

                        float left   = horizontal * -1;
                        float right  = horizontal;
                        float top    = vertical;
                        float bottom = vertical * -1;

                        rtProjectionMatrix = Matrix4x4.Ortho(left, right, bottom, top, rtCamera.nearClipPlane, rtCamera.farClipPlane);
                    }

                    cmd.SetRenderTarget(rtCamera.targetTexture);
                    cmd.SetViewProjectionMatrices(rtCamera.worldToCameraMatrix, rtProjectionMatrix);
                    cmd.ClearRenderTarget(true, true, Color.clear);
                    context.ExecuteCommandBuffer(cmd);

                    context.DrawRenderers(renderingData.cullResults, ref drawingSettings, ref m_FilteringSettings,
                                          ref m_RenderStateBlock);

                    // restore
                    Matrix4x4 originalProjectionMatrix = Matrix4x4.Perspective(originalCamera.fieldOfView, originalCameraAspect,
                                                                               originalCamera.nearClipPlane, originalCamera.farClipPlane);

                    cmd.Clear();
                    cmd.SetRenderTarget(m_ColorTextureHandle.Identifier(), m_DepthAttachmentTextureHandle.Identifier());
                    cmd.SetViewProjectionMatrices(originalCamera.worldToCameraMatrix, originalCamera.projectionMatrix);
                }

                context.ExecuteCommandBuffer(cmd);
                CommandBufferPool.Release(cmd);
            }
        }