URP ProcessRenderRequests的使用

在看Unity URP源码时一直忽略了其中一个方法 ProcessRenderRequests,今天查询API文档记录一下对这个方法的使用与理解

 先贴一下源码

protected override void ProcessRenderRequests<RequestData>(ScriptableRenderContext context, Camera camera, RequestData renderRequest)
        {
            StandardRequest standardRequest = renderRequest as StandardRequest;
            SingleCameraRequest singleRequest = renderRequest as SingleCameraRequest;

            if(standardRequest != null || singleRequest != null)
            {
                RenderTexture destination = standardRequest != null ? standardRequest.destination : singleRequest.destination;
                int mipLevel = standardRequest != null ? standardRequest.mipLevel : singleRequest.mipLevel;
                int slice = standardRequest != null ? standardRequest.slice : singleRequest.slice;
                int face = standardRequest != null ? (int)standardRequest.face : (int)singleRequest.face;

                //store data that will be changed
                var orignalTarget = camera.targetTexture;

                //set data
                RenderTexture temporaryRT = null;
                RenderTextureDescriptor RTDesc = destination.descriptor;
                //need to set use default constructor of RenderTextureDescriptor which doesn't enable allowVerticalFlip which matters for cubemaps.
                if (destination.dimension == TextureDimension.Cube)
                    RTDesc = new RenderTextureDescriptor();

                RTDesc.colorFormat = destination.format;
                RTDesc.volumeDepth = 1;
                RTDesc.msaaSamples = destination.descriptor.msaaSamples;
                RTDesc.dimension = TextureDimension.Tex2D;
                RTDesc.width = destination.width / (int)Math.Pow(2, mipLevel);
                RTDesc.height = destination.height / (int)Math.Pow(2, mipLevel);
                RTDesc.width = Mathf.Max(1, RTDesc.width);
                RTDesc.height = Mathf.Max(1, RTDesc.height);

                //if mip is 0 and target is Texture2D we can immediately render to the requested destination
                if(destination.dimension != TextureDimension.Tex2D || mipLevel != 0)
                {
                    temporaryRT = RenderTexture.GetTemporary(RTDesc);
                }

                camera.targetTexture = temporaryRT ? temporaryRT : destination;

                if (standardRequest != null)
                {
                    Render(context, new Camera[] { camera });
                }
                else
                {
                    RenderSingleCameraInternal(context, camera);
                }

                if(temporaryRT)
                {
                    switch(destination.dimension)
                    {
                        case TextureDimension.Tex2D:
                        case TextureDimension.Tex2DArray:
                        case TextureDimension.Tex3D:
                            Graphics.CopyTexture(temporaryRT, 0, 0, destination, slice, mipLevel);
                            break;
                        case TextureDimension.Cube:
                        case TextureDimension.CubeArray:
                            Graphics.CopyTexture(temporaryRT, 0, 0, destination, face + slice * 6, mipLevel);
                            break;
                    }
                }

                //restore data
                camera.targetTexture = orignalTarget;
                Graphics.SetRenderTarget(orignalTarget);
                RenderTexture.ReleaseTemporary(temporaryRT);
            }
            else
            {
                Debug.LogWarning("The given RenderRequest type: " + typeof(RequestData).FullName  + ", is either invalid or unsupported by the current pipeline");
            }
        }

在URP管线里面可以看到对这个方法没有任何引用,查询API文档后发现是这样写的 

 

 也就是说这个方法是由Camera来触发的 即Camera.SubmitRenderRequests 

对于这个方法API文档上说 如果RenderPipeline implement了这个方法Unity会将一个RT进行更新并将其结果储存在请求数据中 在URP源码中我们可以看到 它先是将RenderData强转为两种类型之后声明了一张临时RT 之后进行正常渲染 只不过是将调用摄像机的RenderTarget设置成这张临时RT 之后将结果给Blit到请求数据中的目标RT中 

也就是说我们可以利用这一点来简单做一个将游戏运行时的图像给渲染到一张我们想要的RT上 

    public RenderTexture renderTexture;

    // Update is called once per frame
    void Update()
    {
        Camera.main.SubmitRenderRequest(new UnityEngine.Rendering.Universal.UniversalRenderPipeline.SingleCameraRequest
        {
            destination = renderTexture,
            mipLevel = 0,
        });
    }

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Unity使用Universal Render PipelineURP)管线,请按照以下步骤操作: 1. 创建一个新项目或打开现有项目。 2. 在Unity的Package Manager中,找到Universal RP并安装它。 3. 在Project视图中创建一个新的URP Asset资源。此资源包含了所有URP管线的设置,包括渲染设置、光照设置和材质设置。 4. 在Project视图中创建一个新的Material资源。将其渲染模式设置为使用URP管线,并将其属性调整为您所需的外观。 5. 在Scene视图中创建一个新的GameObject并将其添加到场景中。将该GameObject的Renderer组件的材质设置为您刚刚创建的Material资源。 6. 在Project视图中创建一个新的Light资源。将其类型设置为Directional,并将其属性调整为您所需的光照效果。 7. 在Scene视图中将该Light资源添加到场景中。 8. 在Project视图中创建一个新的Camera资源。将其属性调整为您所需的摄像机设置。 9. 在Scene视图中将该Camera资源添加到场景中。 10. 在Project视图中创建一个新的Post-processing Profile资源。此资源包含了所有后期处理效果的设置。 11. 在Scene视图中将该Post-processing Profile资源添加到您的Camera组件的Post-processing Settings中。 12. 在Unity的菜单栏中选择Window > Rendering > Lighting Settings。在其中,将Scene视图中的Environment Lighting属性设置为使用Skybox,并将其Skybox属性设置为您所需的天空盒材质。 13. 最后,按下Play按钮,您将看到使用URP管线的场景开始渲染。 这些步骤将为您提供使用URP管线的基础知识。根据您的需求,您可以使用URP管线的其他功能和设置来进一步优化您的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值