Skip to content

Commit efb7f70

Browse files
alex-vazquez-unity3dEvergreen
authored andcommitted
[URP] SingleCameraRequest : Add missing RenderPipelineManager Begin/End Camera and Context callbacks
SingleCameraRequest on URP are rendering a single camera, it's purpose is rendering a camera without the full list of stack cameras. This avoid some overhead. As we are rendering 1 single camera, we are missing: ``` RenderPipelineManager.beginContextRendering RenderPipelineManager.endContextRendering RenderPipelineManager.beginCameraRendering RenderPipelineManager.endCameraRendering ``` Jira Issue: https://jira.unity3d.com/browse/UUM-69268 I've added a new docs page in URP with an exaple of how to use SubmitRenderRequest and how to subscribe to RenderPipelineManager callbacks in each case.
1 parent 0d6f973 commit efb7f70

File tree

6 files changed

+383
-138
lines changed

6 files changed

+383
-138
lines changed

Packages/com.unity.render-pipelines.core/Documentation~/User-Render-Requests.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,3 +89,7 @@ public class StandardRenderRequest : MonoBehaviour
8989
}
9090
```
9191

92+
## Other useful information
93+
94+
- On [Universal Render Pipeline (URP)](https://docs.unity3d.com/Packages/com.unity.render-pipelines.universal@latest/User-Render-Requests.html).
95+

Packages/com.unity.render-pipelines.universal/Documentation~/TableOfContents.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@
100100
* [Render a camera's output to a Render Texture](rendering-to-a-render-texture.md)
101101
* [Customize a camera](universal-additional-camera-data.md)
102102
* [Camera component properties](camera-component-reference.md)
103+
* [Render Requests](User-Render-Requests.md)
103104
* [Post-processing](integration-with-post-processing.md)
104105
* [How to configure](integration-with-post-processing.md#post-proc-how-to)
105106
* [HDR Output](post-processing/hdr-output.md)
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# Render Requests
2+
3+
For a general documentation see the [Core Package](https://docs.unity3d.com/Packages/com.unity.render-pipelines.core@latest/User-Render-Requests.html) about Render Requests.
4+
5+
## Use UniversalRenderPipeline.SingleCameraRequest
6+
7+
`UniversalRenderPipeline.SingleCameraRequest` renders a single camera, without taking into account the full stack of cameras.
8+
9+
You can still hook into callbacks from [RenderPipelineManager](https://docs.unity3d.com/ScriptReference/Rendering.RenderPipelineManager.html).
10+
11+
The following code sample shows that you can hook into [RenderPipelineManager.endContextRendering](https://docs.unity3d.com/ScriptReference/Rendering.RenderPipelineManager-endContextRendering.html) `UniversalRenderPipeline.SingleCameraRequest`
12+
13+
To try out this example:
14+
15+
- Attach the script to a **GameObject** in the **Scene**.
16+
- Configure the **cams** and **rts**.
17+
- Set **useSingleCameraRequestValues** to true or false depending on which type of render request you want to use.
18+
- Select **Enter Play Mode**.
19+
- See the **Console** Log.
20+
21+
```
22+
using System.Collections;
23+
using System.Collections.Generic;
24+
using System.Text;
25+
using UnityEngine;
26+
using UnityEngine.Rendering;
27+
using UnityEngine.Rendering.Universal;
28+
29+
public class SingleCameraRenderRequestExample : MonoBehaviour
30+
{
31+
public Camera[] cams;
32+
public RenderTexture[] rts;
33+
34+
void Start()
35+
{
36+
if (cams == null || cams.Length == 0 || rts == null || cams.Length != rts.Length)
37+
{
38+
Debug.LogError("Invalid setup");
39+
return;
40+
}
41+
42+
StartCoroutine(RenderSingleRequestNextFrame());
43+
RenderPipelineManager.endContextRendering += OnEndContextRendering;
44+
}
45+
46+
void OnEndContextRendering(ScriptableRenderContext context, List<Camera> cameras)
47+
{
48+
var stb = new StringBuilder($"Cameras Count from EndContextRendering: <b> {cameras.Count}</b>.");
49+
foreach (var cam in cameras)
50+
{
51+
stb.AppendLine($"- {cam.name}");
52+
}
53+
Debug.Log(stb.ToString());
54+
}
55+
56+
void OnDestroy()
57+
{
58+
RenderPipelineManager.endContextRendering -= OnEndContextRendering;
59+
}
60+
61+
IEnumerator RenderSingleRequestNextFrame()
62+
{
63+
yield return new WaitForEndOfFrame();
64+
65+
SendSingleRenderRequests();
66+
67+
yield return new WaitForEndOfFrame();
68+
69+
StartCoroutine(RenderSingleRequestNextFrame());
70+
}
71+
72+
void SendSingleRenderRequests()
73+
{
74+
for (int i = 0; i < cams.Length; i++)
75+
{
76+
UniversalRenderPipeline.SingleCameraRequest request =
77+
new UniversalRenderPipeline.SingleCameraRequest();
78+
79+
// Check if the request is supported by the active render pipeline
80+
if (RenderPipeline.SupportsRenderRequest(cams[i], request))
81+
{
82+
request.destination = rts[i];
83+
RenderPipeline.SubmitRenderRequest(cams[i], request);
84+
}
85+
}
86+
}
87+
}
88+
```

0 commit comments

Comments
 (0)