コード例 #1
0
    public void Setup(ScriptableRenderContext context, Camera camera, PostFXSettings settings)
    {
        this.context  = context;
        this.camera   = camera;
        this.settings = camera.cameraType <= CameraType.SceneView ? settings : null;

        ApplySceneViewState();
    }
コード例 #2
0
    public void Setup(ScriptableRenderContext context, Camera camera, PostFXSettings settings, bool useHDR, int colorLUTResolution)
    {
        this.context            = context;
        this.camera             = camera;
        this.settings           = camera.cameraType <= CameraType.SceneView ? settings : null;
        this.useHDR             = useHDR;
        this.colorLUTResolution = colorLUTResolution;

        ApplySceneViewState();
    }
コード例 #3
0
    public void Render(
        ScriptableRenderContext context, Camera camera, bool allowHDR,
        bool useDynamicBatching, bool useGPUInstancing, bool useLightsPerObject,
        ShadowSettings shadowSettings, PostFXSettings postFXSettings,
        int colorLUTResolution
        )
    {
        this.context = context;
        this.camera  = camera;

        var            crpCamera      = camera.GetComponent <CustomRenderPipelineCamera>();
        CameraSettings cameraSettings =
            crpCamera ? crpCamera.Settings : defaultCameraSettings;

        if (cameraSettings.overridePostFX)
        {
            postFXSettings = cameraSettings.postFXSettings;
        }

        PrepareBuffer();
        PrepareForSceneWindow();
        if (!Cull(shadowSettings.maxDistance))
        {
            return;
        }
        useHDR = allowHDR && camera.allowHDR;

        buffer.BeginSample(SampleName);
        ExecuteBuffer();
        lighting.Setup(
            context, cullingResults, shadowSettings, useLightsPerObject,
            cameraSettings.maskLights ? cameraSettings.renderingLayerMask : -1
            );
        postFXStack.Setup(
            context, camera, postFXSettings, useHDR, colorLUTResolution,
            cameraSettings.finalBlendMode
            );
        buffer.EndSample(SampleName);
        Setup();
        DrawVisibleGeometry(
            useDynamicBatching, useGPUInstancing, useLightsPerObject,
            cameraSettings.renderingLayerMask
            );
        DrawUnsupportedShaders();
        DrawGizmosBeforeFX();
        if (postFXStack.IsActive)
        {
            postFXStack.Render(frameBufferId);
        }
        DrawGizmosAfterFX();
        Cleanup();
        Submit();
    }
コード例 #4
0
 public CustomRenderPipeline(
     bool useDynamicBatching, bool useGPUInstancing, bool useSRPBatcher,
     ShadowSettings shadowSettings, PostFXSettings postFXSettings
     )
 {
     this.shadowSettings     = shadowSettings;
     this.postFXSettings     = postFXSettings;
     this.useDynamicBatching = useDynamicBatching;
     this.useGPUInstancing   = useGPUInstancing;
     GraphicsSettings.useScriptableRenderPipelineBatching = useSRPBatcher;
     GraphicsSettings.lightsUseLinearIntensity            = true;
 }
コード例 #5
0
    public CustomRenderPipeline(bool allowHDR, bool useDynamicBatching, bool useGPUInstancing, bool useSRPBatcher, bool useLightsPerObject, ShadowSettings shadowSettings, PostFXSettings postFXSettings)
    {
        this.allowHDR           = allowHDR;
        this.shadowSettings     = shadowSettings;
        this.useDynamicBatching = useDynamicBatching;
        this.useGPUInstancing   = useGPUInstancing;
        this.useLightsPerObject = useLightsPerObject;
        this.postFXSettings     = postFXSettings;

        GraphicsSettings.useScriptableRenderPipelineBatching = useSRPBatcher;
        GraphicsSettings.lightsUseLinearIntensity            = true;

        InitializeForEditor();
    }
コード例 #6
0
 public void Setup(
     ScriptableRenderContext context, Camera camera, Vector2Int bufferSize,
     PostFXSettings settings, bool useHDR, int colorLUTResolution,
     CameraSettings.FinalBlendMode finalBlendMode, CameraBufferSettings.BicubicRescalingMode bicubicRescaling
     )
 {
     this.useHDR     = useHDR;
     this.context    = context;
     this.camera     = camera;
     this.bufferSize = bufferSize;
     this.settings   =
         (camera.cameraType <= CameraType.SceneView) ? settings : null;
     this.colorLUTResolution = colorLUTResolution;
     this.finalBlendMode     = finalBlendMode;
     this.bicubicRescaling   = bicubicRescaling;
     ApplySceneViewState();
 }
コード例 #7
0
 public CustomRenderPipeline(CameraBufferSettings cameraBufferSettings, bool useDynamicBathcing, bool useGPUInstancing, bool useLightsPerObject,
                             bool useSRPBatcher, ShadowSettings shadowSettings, PostFXSettings postFXSettings, int colorLUTResolution, Shader cameraRendererShader)
 {
     this.colorLUTResolution   = colorLUTResolution;
     this.cameraBufferSettings = cameraBufferSettings;
     this.postFXSettings       = postFXSettings;
     this.shadowSettings       = shadowSettings;
     this.useDynamicBathcing   = useDynamicBathcing;
     this.useGPUInstancing     = useGPUInstancing;
     this.useLightsPerObject   = useLightsPerObject;
     //开启SRP Batch 会优先使用
     GraphicsSettings.useScriptableRenderPipelineBatching = useSRPBatcher;
     //是用Gamma颜色还是线性颜色
     GraphicsSettings.lightsUseLinearIntensity = true;
     //
     InitializeForEditor();
     renderer = new CameraRenderer(cameraRendererShader);
 }
コード例 #8
0
 public void Setup
     (ScriptableRenderContext context,
     Camera camera, Vector2Int bufferSize,
     PostFXSettings settings, bool keepAlpha,
     bool useHDR, int colorLUTResolution,
     CameraSettings.FinalBlendMode finalBlendMode,
     CameraBufferSettings.BicubicRescalingMode bicubicRescaling,
     CameraBufferSettings.FXAA fxaa)
 {
     this.context            = context;
     this.camera             = camera;
     this.settings           = camera.cameraType <= CameraType.SceneView ? settings : null;
     this.useHDR             = useHDR;
     this.colorLUTResolution = colorLUTResolution;
     this.finalBlendMode     = finalBlendMode;
     this.bufferSize         = bufferSize;
     this.bicubicRescaling   = bicubicRescaling;
     this.fxaa      = fxaa;
     this.keepAlpha = keepAlpha;
     ApplySceneViewState();
     //Debug.Log(fxaa.enabled);
 }
コード例 #9
0
    public void Render(
        ScriptableRenderContext context, Camera camera,
        bool useDynamicBatching, bool useGPUInstancing,
        ShadowSettings shadowSettings, PostFXSettings postFXSettings
        )
    {
        this.context = context;
        this.camera  = camera;

        PrepareBuffer();
        PrepareForSceneWindow();
        if (!Cull(shadowSettings.maxDistance))
        {
            return;
        }

        buffer.BeginSample(SampleName);
        ExecuteBuffer();
        lighting.Setup(context, cullingResults, shadowSettings);
        postFXStack.Setup(context, camera, postFXSettings);

        buffer.EndSample(SampleName);
        Setup();
        DrawVisibleGeometry(useDynamicBatching, useGPUInstancing);
        DrawUnsupportedShaders();
        DrawGizmosBeforeFX();

        //开启绘制
        if (postFXStack.IsActive)
        {
            postFXStack.Render(frameBufferId);
        }
        DrawGizmosAfterFX();

        Cleanup();
        Submit();
    }
コード例 #10
0
    public void Render(ScriptableRenderContext context, Camera camera, PostFXSettings postFXSettings)
    {
        this.context = context;
        this.camera  = camera;

        PrepareForSceneWindow();

        if (!Cull())
        {
            return;
        }

        postFXStack.Setup(context, camera, postFXSettings);
        Setup();
        DrawVisibleGeometry();
        DrawGizmosBeforeFX();
        if (postFXStack.IsActive)
        {
            postFXStack.Render(frameBufferId);
        }
        DrawGizmosAfterFX();
        Cleanup();
        Submit();
    }
コード例 #11
0
    public void Render(
        ScriptableRenderContext context, Camera camera,
        CameraBufferSettings bufferSettings,
        bool useDynamicBatching, bool useGPUInstancing, bool useLightsPerObject,
        ShadowSettings shadowSettings, PostFXSettings postFXSettings,
        int colorLUTResolution
        )
    {
        this.context = context;
        this.camera  = camera;

        var            crpCamera      = camera.GetComponent <CustomRenderPipelineCamera>();
        CameraSettings cameraSettings =
            crpCamera ? crpCamera.Settings : defaultCameraSettings;

        if (camera.cameraType == CameraType.Reflection)
        {
            useColorTexture = bufferSettings.copyColorReflection;
            useDepthTexture = bufferSettings.copyDepthReflection;
        }
        else
        {
            useColorTexture = bufferSettings.copyColor && cameraSettings.copyColor;
            useDepthTexture = bufferSettings.copyDepth && cameraSettings.copyDepth;
        }

        if (cameraSettings.overridePostFX)
        {
            postFXSettings = cameraSettings.postFXSettings;
        }

        float renderScale = cameraSettings.GetRenderScale(bufferSettings.renderScale);

        useScaledRendering = renderScale <0.99f || renderScale> 1.01f;
        PrepareBuffer();
        PrepareForSceneWindow();
        if (!Cull(shadowSettings.maxDistance))
        {
            return;
        }

        useHDR = bufferSettings.allowHDR && camera.allowHDR;
        if (useScaledRendering)
        {
            renderScale  = Mathf.Clamp(renderScale, renderScaleMin, renderScaleMax);
            bufferSize.x = (int)(camera.pixelWidth * renderScale);
            bufferSize.y = (int)(camera.pixelHeight * renderScale);
        }
        else
        {
            bufferSize.x = camera.pixelWidth;
            bufferSize.y = camera.pixelHeight;
        }

        buffer.BeginSample(SampleName);
        buffer.SetGlobalVector(bufferSizeId, new Vector4(
                                   1f / bufferSize.x, 1f / bufferSize.y,
                                   bufferSize.x, bufferSize.y
                                   ));
        ExecuteBuffer();
        lighting.Setup(
            context, cullingResults, shadowSettings, useLightsPerObject,
            cameraSettings.maskLights ? cameraSettings.renderingLayerMask : -1
            );

        bufferSettings.fxaa.enabled &= cameraSettings.allowFXAA;
        postFXStack.Setup(
            context, camera, bufferSize, postFXSettings, cameraSettings.keepAlpha, useHDR,
            colorLUTResolution, cameraSettings.finalBlendMode,
            bufferSettings.bicubicRescaling, bufferSettings.fxaa
            );
        buffer.EndSample(SampleName);
        Setup();
        DrawVisibleGeometry(
            useDynamicBatching, useGPUInstancing, useLightsPerObject,
            cameraSettings.renderingLayerMask
            );
        DrawUnsupportedShaders();
        DrawGizmosBeforeFX();
        if (postFXStack.IsActive)
        {
            postFXStack.Render(colorAttachmentId);
        }
        else if (useIntermediateBuffer)
        {
            DrawFinal(cameraSettings.finalBlendMode);
            ExecuteBuffer();
        }
        DrawGizmosAfterFX();
        Cleanup();
        Submit();
    }
コード例 #12
0
    public void Render(ScriptableRenderContext IN_context, 
        Camera IN_camera, CameraBufferSettings cameraBufferSettings, bool useDynameicBatching, 
        bool useGPUInstancing, bool useLightPerObject,
        ShadowSettings shadowSetting, PostFXSettings postFXSettings, int colorLUTResolution)
    {
        this.context = IN_context;
        this.camera = IN_camera;

        //setup custom camera settings
        //for per camera blend, PostFX settings
        var crpCamera = camera.GetComponent<CustomRenderPipelineCamera>();
        CameraSettings cameraSettings = crpCamera ? crpCamera.Settings : defaultCameraSettings;

        //use depthtexture so shader can access the current buffer depth    
        if (camera.cameraType == CameraType.Reflection)
        {
            useDepthTexture = cameraBufferSettings.copyDepthReflection;
            useColorTexture = cameraBufferSettings.copyColorReflection;
        }
        else 
        {
            useDepthTexture = cameraBufferSettings.copyDepth && cameraSettings.copyDepth;
            useColorTexture = cameraBufferSettings.copyColor && cameraSettings.copyColor;
        }

        if (cameraSettings.overridePostFX)
        {
            //override PostFX option for each cam
            postFXSettings = cameraSettings.postFXSettings;
        }

        //set render scale, scale should atleast move a bit to take effect
        float renderScale = cameraSettings.GetRenderScale(cameraBufferSettings.renderScale);
        useScaledRendering = renderScale < 0.99f || renderScale > 1.01f;

        //change buffer name to the camera name
        PrepareBuffer();

        //add UI (WorldGeometry) to the scene camera, so we can see UI in editor view
        PrepareForSceneView();
        if (!Cull(shadowSetting.maxDistance))
        {
            return;
        }

        this.useHDR = cameraBufferSettings.allowHDR && camera.allowHDR;

        //calculate and store buffersize
        if (useScaledRendering)
        {
            renderScale = Mathf.Clamp(renderScale, renderScaleMin, renderScaleMax);
            bufferSize.x = (int)(camera.pixelWidth * renderScale);
            bufferSize.y = (int)(camera.pixelHeight * renderScale);
        }
        else 
        {
            bufferSize.x = camera.pixelWidth;
            bufferSize.y = camera.pixelHeight;
        }

        buffer.BeginSample(SampleName);//Include lights and shadow rendering in main cam profile

        //pass the buffer size to GPU so the when sample color and depthe texture, 
        //we can refer to correct buffer size
        buffer.SetGlobalVector(bufferSizeId, new Vector4(
            (float)1/bufferSize.x, (float)1 /bufferSize.y, bufferSize.x, bufferSize.y
        ));


        ExecuteBuffer();
        //get transfer DirLight data to GPU
        //Setup shadow RT and shadow rendering
        lighting.Setup(context, cullingResults, shadowSetting, useLightPerObject,
            cameraSettings.maskLights ? cameraSettings.RenderingLayerMask : -1);

        //FXAA is enable per camera
        cameraBufferSettings.fxaa.enabled = cameraSettings.allowFXAA;
        //setup postFX
        postFXStack.Setup(context, camera, 
            bufferSize, postFXSettings, cameraSettings.keepAlpha, useHDR, 
            colorLUTResolution, cameraSettings.finalBlendMode,
            cameraBufferSettings.bicubicResampling,
            cameraBufferSettings.fxaa);

        buffer.EndSample(SampleName);

        //Setup rendertarget for normal oject rendering
        Setup();
        DrawVisibleGeometry(useDynameicBatching, useGPUInstancing, useLightPerObject, cameraSettings.RenderingLayerMask);

        //this makes the Legacy shader draw upon the tranparent object
        //makes it wired, but they are not supported who cares~
        DrawUnsupportedShaders();

        DrawGizmosBeforeFX();

        if (postFXStack.IsActive)
        {
            postFXStack.Render(colorAttachmentId);
        }
        else if (useIntermediateBuffer)
        {
            // we need to copy the image from intermediate to final 
            //otherwise nothing goes to camera target, Since PFX is not active 
            //Draw(colorAttachmentId, BuiltinRenderTextureType.CameraTarget);
            DrawFinal(cameraSettings.finalBlendMode);
            ExecuteBuffer();
        }

        DrawGizmosAfterFX();

        Cleanup();

        //all action will be buffered and render action only begin after submit!
        Submit();
    }
コード例 #13
0
    public void Render(ScriptableRenderContext contex, Camera camera, CameraBufferSettings bufferSettings, bool useDynamicBatching, bool useGPUInstancing, bool useLightsPerObject,
                       ShadowSettings shadowSettings, PostFXSettings postFXSettings, int colorLUTResolution)
    {
        this.context = contex;
        this.camera  = camera;

        //var crpCamera = camera.GetComponent<CustomRenderPipelineCamera>(); crpCamera != null ? crpCamera.Settings :
        CameraSettings cameraSettings = defaultCameraSettings;

        //useDepthTexture = true;
        if (camera.cameraType == CameraType.Reflection)
        {
            useColorTexture = bufferSettings.copyColorReflection;
            useDepthTexture = bufferSettings.copyDepthRelections;
        }
        else
        {
            useColorTexture = bufferSettings.copyColor && cameraSettings.copyColor;
            //两个条件成立
            useDepthTexture = bufferSettings.copyDepth && cameraSettings.copyDepth;
        }
        //判断是否覆盖摄像机设置
        if (cameraSettings.overridePostFX)
        {
            postFXSettings = cameraSettings.postFXSettings;
        }
        //每个摄像机有自己的Buffer
        PrepareBuffer();
        //UI
        PrepareForSceneWindow();
        //阴影Cull
        if (!Cull(shadowSettings.maxDistance))
        {
            return;
        }
        useHDR = bufferSettings.allowHDR && camera.allowHDR;
        buffer.BeginSample(SampleName);
        ExcuteBuffer();
        //灯光配置 添加阴影参数
        lighting.Setup(contex, cullingResults, shadowSettings, useLightsPerObject, cameraSettings.maskLights ? cameraSettings.renderingLayerMask :-1);
        //后期配置
        postFXStack.Setup(context, camera, postFXSettings, useHDR, colorLUTResolution, cameraSettings.finalBlendMode);
        buffer.EndSample(SampleName);
        //常规渲染
        Setup();
        DrawVisibleGeometry(useDynamicBatching, useGPUInstancing, useLightsPerObject, cameraSettings.renderingLayerMask);
        //Un support shader
        DrawUnsupportedShaders();
        //Gizmos 线
        DrawGizmosBeforeFX();
        if (postFXStack.IsActive)
        {
            postFXStack.Render(colorAttachmentId);
        }
        else if (useIntermediateBuffer)
        {
            if (camera.targetTexture)
            {
                //Test UV

                buffer.CopyTexture(colorAttachmentId, camera.targetTexture);
            }
            else
            {
                //画到摄像机
                Draw(colorAttachmentId, BuiltinRenderTextureType.CameraTarget);
            }
            ExcuteBuffer();
        }
        DrawGizmosAfterFX();
        //释放纹理资源
        Cleanup();
        //lighting.Cleanup();
        Submit();
    }
コード例 #14
0
 public CustomPipeline(PostFXSettings postFXSettings)
 {
     this.postFXSettings = postFXSettings;
 }