Ejemplo n.º 1
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);
 }
Ejemplo n.º 2
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();
    }
Ejemplo n.º 3
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;
        }

        PrepareBuffer();
        PrepareForSceneWindow();
        if (!Cull(shadowSettings.maxDistance))
        {
            return;
        }
        useHDR = bufferSettings.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(colorAttachmentId);
        }
        else if (useIntermediateBuffer)
        {
            DrawFinal(cameraSettings.finalBlendMode);
            ExecuteBuffer();
        }
        DrawGizmosAfterFX();
        Cleanup();
        Submit();
    }
Ejemplo n.º 4
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();
    }
Ejemplo n.º 5
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();
    }