Skip to content

Commit 3600301

Browse files
SkyRenderer now renders into a 256 cubemap RT and updates GI with it.
1 parent dc4507c commit 3600301

File tree

7 files changed

+387
-295
lines changed

7 files changed

+387
-295
lines changed

Assets/ScriptableRenderLoop/HDRenderLoop/HDRenderLoop.cs

Lines changed: 17 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -276,38 +276,23 @@ void InitAndClearBuffer(Camera camera, RenderLoop renderLoop)
276276
{
277277
m_gbufferManager.InitGBuffers(w, h, cmd);
278278
}
279-
280-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_CameraColorBuffer), new RenderTargetIdentifier(s_CameraDepthBuffer));
281-
cmd.ClearRenderTarget(true, false, new Color(0, 0, 0, 0));
282279
renderLoop.ExecuteCommandBuffer(cmd);
283280
cmd.Dispose();
284-
}
285281

282+
Utilities.SetRenderTarget(renderLoop, s_CameraColorBufferRT, s_CameraDepthBufferRT, ClearFlag.ClearDepth);
283+
}
286284

287285
// TEMP: As we are in development and have not all the setup pass we still clear the color in emissive buffer and gbuffer, but this will be removed later.
288286

289287
// Clear HDR target
290288
{
291-
var cmd = new CommandBuffer();
292-
cmd.name = "Clear HDR target";
293-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_CameraColorBuffer), new RenderTargetIdentifier(s_CameraDepthBuffer));
294-
cmd.ClearRenderTarget(false, true, new Color(0, 0, 0, 0));
295-
renderLoop.ExecuteCommandBuffer(cmd);
296-
cmd.Dispose();
289+
Utilities.SetRenderTarget(renderLoop, s_CameraColorBufferRT, s_CameraDepthBufferRT, ClearFlag.ClearColor, Color.black, "Clear HDR target");
297290
}
298291

299292

300293
// Clear GBuffers
301294
{
302-
var cmd = new CommandBuffer();
303-
cmd.name = "Clear GBuffer";
304-
// Write into the Camera Depth buffer
305-
cmd.SetRenderTarget(m_gbufferManager.GetGBuffers(), new RenderTargetIdentifier(s_CameraDepthBuffer));
306-
// Clear everything
307-
// TODO: Clear is not required for color as we rewrite everything, will save performance.
308-
cmd.ClearRenderTarget(false, true, new Color(0, 0, 0, 0));
309-
renderLoop.ExecuteCommandBuffer(cmd);
310-
cmd.Dispose();
295+
Utilities.SetRenderTarget(renderLoop, m_gbufferManager.GetGBuffers(), s_CameraDepthBufferRT, ClearFlag.ClearColor, Color.black, "Clear GBuffer");
311296
}
312297

313298
// END TEMP
@@ -348,13 +333,9 @@ void RenderDepthPrepass(CullResults cull, Camera camera, RenderLoop renderLoop)
348333
if (!debugParameters.useDepthPrepass)
349334
return;
350335

351-
// TODO: Must do opaque then alpha masked for performance!
336+
// TODO: Must do opaque then alpha masked for performance!
352337
// TODO: front to back for opaque and by materal for opaque tested when we split in two
353-
var cmd = new CommandBuffer { name = "Depth Prepass" };
354-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_CameraDepthBuffer));
355-
renderLoop.ExecuteCommandBuffer(cmd);
356-
cmd.Dispose();
357-
338+
Utilities.SetRenderTarget(renderLoop, s_CameraDepthBufferRT, "Depth Prepass");
358339
RenderOpaqueRenderList(cull, camera, renderLoop, "DepthOnly");
359340
}
360341

@@ -366,11 +347,7 @@ void RenderGBuffer(CullResults cull, Camera camera, RenderLoop renderLoop)
366347
}
367348

368349
// setup GBuffer for rendering
369-
var cmd = new CommandBuffer { name = "GBuffer Pass" };
370-
cmd.SetRenderTarget(m_gbufferManager.GetGBuffers(), new RenderTargetIdentifier(s_CameraDepthBuffer));
371-
renderLoop.ExecuteCommandBuffer(cmd);
372-
cmd.Dispose();
373-
350+
Utilities.SetRenderTarget(renderLoop, m_gbufferManager.GetGBuffers(), s_CameraDepthBufferRT, "GBuffer Pass");
374351
// render opaque objects into GBuffer
375352
RenderOpaqueRenderList(cull, camera, renderLoop, "GBuffer", Utilities.kRendererConfigurationBakedLighting);
376353
}
@@ -383,23 +360,15 @@ void RenderForwardOpaqueDepth(CullResults cull, Camera camera, RenderLoop render
383360
return;
384361

385362
// TODO: Use the render queue index to only send the forward opaque!
386-
var cmd = new CommandBuffer { name = "Depth Prepass" };
387-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_CameraDepthBuffer));
388-
renderLoop.ExecuteCommandBuffer(cmd);
389-
cmd.Dispose();
390-
363+
Utilities.SetRenderTarget(renderLoop, s_CameraDepthBufferRT, "Clear HDR target");
391364
RenderOpaqueRenderList(cull, camera, renderLoop, "DepthOnly");
392365
}
393366

394367
void RenderDebugViewMaterial(CullResults cull, Camera camera, RenderLoop renderLoop)
395368
{
396369
// Render Opaque forward
397370
{
398-
var cmd = new CommandBuffer { name = "DebugView Material Mode Pass" };
399-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_CameraColorBuffer), new RenderTargetIdentifier(s_CameraDepthBuffer));
400-
cmd.ClearRenderTarget(true, true, new Color(0, 0, 0, 0));
401-
renderLoop.ExecuteCommandBuffer(cmd);
402-
cmd.Dispose();
371+
Utilities.SetRenderTarget(renderLoop, s_CameraColorBufferRT, s_CameraDepthBufferRT, Utilities.kClearAll, Color.black, "DebugView Material Mode Pass");
403372

404373
Shader.SetGlobalInt("_DebugViewMaterial", (int)debugParameters.debugViewMaterial);
405374

@@ -416,7 +385,7 @@ void RenderDebugViewMaterial(CullResults cull, Camera camera, RenderLoop renderL
416385
// m_gbufferManager.BindBuffers(m_DeferredMaterial);
417386
// TODO: Bind depth textures
418387
var cmd = new CommandBuffer { name = "GBuffer Debug Pass" };
419-
cmd.Blit(null, new RenderTargetIdentifier(s_CameraColorBuffer), m_DebugViewMaterialGBuffer, 0);
388+
cmd.Blit(null, s_CameraColorBufferRT, m_DebugViewMaterialGBuffer, 0);
420389
renderLoop.ExecuteCommandBuffer(cmd);
421390
cmd.Dispose();
422391
}
@@ -429,7 +398,7 @@ void RenderDebugViewMaterial(CullResults cull, Camera camera, RenderLoop renderL
429398
// Last blit
430399
{
431400
var cmd = new CommandBuffer { name = "Blit DebugView Material Debug" };
432-
cmd.Blit(new RenderTargetIdentifier(s_CameraColorBuffer), BuiltinRenderTextureType.CameraTarget);
401+
cmd.Blit(s_CameraColorBufferRT, BuiltinRenderTextureType.CameraTarget);
433402
renderLoop.ExecuteCommandBuffer(cmd);
434403
cmd.Dispose();
435404
}
@@ -469,7 +438,7 @@ void RenderDeferredLighting(Camera camera, RenderLoop renderLoop)
469438
// m_gbufferManager.BindBuffers(m_DeferredMaterial);
470439
// TODO: Bind depth textures
471440
var cmd = new CommandBuffer { name = "Deferred Ligthing Pass" };
472-
cmd.Blit(null, new RenderTargetIdentifier(s_CameraColorBuffer), m_DeferredMaterial, 0);
441+
cmd.Blit(null, s_CameraColorBufferRT, m_DeferredMaterial, 0);
473442
renderLoop.ExecuteCommandBuffer(cmd);
474443
cmd.Dispose();
475444
}
@@ -484,10 +453,7 @@ void RenderForward(CullResults cullResults, Camera camera, RenderLoop renderLoop
484453
// Bind material data
485454
m_LitRenderLoop.Bind();
486455

487-
var cmd = new CommandBuffer { name = "Forward Pass" };
488-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_CameraColorBuffer), new RenderTargetIdentifier(s_CameraDepthBuffer));
489-
renderLoop.ExecuteCommandBuffer(cmd);
490-
cmd.Dispose();
456+
Utilities.SetRenderTarget(renderLoop, s_CameraColorBufferRT, s_CameraDepthBufferRT, "Forward Pass");
491457

492458
if (debugParameters.useForwardRenderingOnly)
493459
{
@@ -502,11 +468,7 @@ void RenderForwardUnlit(CullResults cullResults, Camera camera, RenderLoop rende
502468
// Bind material data
503469
m_LitRenderLoop.Bind();
504470

505-
var cmd = new CommandBuffer { name = "Forward Unlit Pass" };
506-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_CameraColorBuffer), new RenderTargetIdentifier(s_CameraDepthBuffer));
507-
renderLoop.ExecuteCommandBuffer(cmd);
508-
cmd.Dispose();
509-
471+
Utilities.SetRenderTarget(renderLoop, s_CameraColorBufferRT, s_CameraDepthBufferRT, "Forward Unlit Pass");
510472
RenderOpaqueRenderList(cullResults, camera, renderLoop, "ForwardUnlit");
511473
RenderTransparentRenderList(cullResults, camera, renderLoop, "ForwardUnlit");
512474
}
@@ -524,7 +486,7 @@ void RenderVelocity(CullResults cullResults, Camera camera, RenderLoop renderLoo
524486

525487
var cmd = new CommandBuffer { name = "Velocity Pass" };
526488
cmd.GetTemporaryRT(s_VelocityBuffer, w, h, 0, FilterMode.Point, Builtin.RenderLoop.GetVelocityBufferFormat(), Builtin.RenderLoop.GetVelocityBufferReadWrite());
527-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_VelocityBuffer), new RenderTargetIdentifier(s_CameraDepthBuffer));
489+
cmd.SetRenderTarget(s_VelocityBufferRT, s_CameraDepthBufferRT);
528490
renderLoop.ExecuteCommandBuffer(cmd);
529491
cmd.Dispose();
530492

@@ -539,7 +501,7 @@ void RenderDistortion(CullResults cullResults, Camera camera, RenderLoop renderL
539501

540502
var cmd = new CommandBuffer { name = "Distortion Pass" };
541503
cmd.GetTemporaryRT(s_DistortionBuffer, w, h, 0, FilterMode.Point, Builtin.RenderLoop.GetDistortionBufferFormat(), Builtin.RenderLoop.GetDistortionBufferReadWrite());
542-
cmd.SetRenderTarget(new RenderTargetIdentifier(s_DistortionBuffer), new RenderTargetIdentifier(s_CameraDepthBuffer));
504+
cmd.SetRenderTarget(s_DistortionBufferRT, s_CameraDepthBufferRT);
543505
renderLoop.ExecuteCommandBuffer(cmd);
544506
cmd.Dispose();
545507

@@ -573,7 +535,7 @@ void FinalPass(RenderLoop renderLoop)
573535
var cmd = new CommandBuffer { name = "FinalPass" };
574536

575537
// Resolve our HDR texture to CameraTarget.
576-
cmd.Blit(new RenderTargetIdentifier(s_CameraColorBuffer), BuiltinRenderTextureType.CameraTarget, m_FinalPassMaterial, 0);
538+
cmd.Blit(s_CameraColorBufferRT, BuiltinRenderTextureType.CameraTarget, m_FinalPassMaterial, 0);
577539
renderLoop.ExecuteCommandBuffer(cmd);
578540
cmd.Dispose();
579541
}

Assets/ScriptableRenderLoop/HDRenderLoop/Sky/SkyRenderer.cs

Lines changed: 78 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,16 @@ public class SkyParameters
1616

1717
public class SkyRenderer
1818
{
19-
const int kSkyCubemapSize = 128;
19+
const int kSkyCubemapSize = 256;
2020

21-
RenderTexture m_SkyboxCubemap = null;
21+
RenderTexture m_SkyboxCubemapRT = null;
2222

23-
Material m_SkyboxMaterial = null;
24-
Material m_SkyHDRIMaterial = null;
23+
Material m_StandardSkyboxMaterial = null; // This is the Unity standard skybox material. Used to pass the correct cubemap to Enlighten.
24+
Material m_SkyHDRIMaterial = null; // Renders a cubemap into a render texture (can be cube or 2D)
2525

26-
Mesh BuildSkyMesh(Camera camera)
26+
GameObject[] m_CubemapFaceCamera = new GameObject[6];
27+
28+
Mesh BuildSkyMesh(Camera camera, bool forceUVBottom)
2729
{
2830
Vector4 vertData0 = new Vector4(-1.0f, -1.0f, 1.0f, 1.0f);
2931
Vector4 vertData1 = new Vector4(1.0f, -1.0f, 1.0f, 1.0f);
@@ -54,7 +56,7 @@ Mesh BuildSkyMesh(Camera camera)
5456
Vector4 direction2 = (posWorldSpace2 / posWorldSpace2.w - cameraPosition);
5557
Vector4 direction3 = (posWorldSpace3 / posWorldSpace3.w - cameraPosition);
5658

57-
if (SystemInfo.graphicsUVStartsAtTop)
59+
if (SystemInfo.graphicsUVStartsAtTop && !forceUVBottom)
5860
{
5961
eyeVectorData[3] = new Vector3(direction0.x, direction0.y, direction0.z).normalized;
6062
eyeVectorData[2] = new Vector3(direction1.x, direction1.y, direction1.z).normalized;
@@ -83,32 +85,90 @@ Mesh BuildSkyMesh(Camera camera)
8385
public void Rebuild()
8486
{
8587
// TODO: We need to have an API to send our sky information to Enlighten. For now use a workaround through skybox/cubemap material...
86-
m_SkyboxMaterial = Utilities.CreateEngineMaterial("Skybox/Cubemap");
87-
RenderSettings.skybox = m_SkyboxMaterial; // Setup this material as the default to be use in RenderSettings
88-
RenderSettings.ambientIntensity = 1.0f; // fix this to 1, this parameter should not exist!
89-
RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Skybox; // Force skybox for our HDRI
90-
RenderSettings.reflectionIntensity = 1.0f;
88+
m_StandardSkyboxMaterial = Utilities.CreateEngineMaterial("Skybox/Cubemap");
9189

9290
m_SkyHDRIMaterial = Utilities.CreateEngineMaterial("Hidden/HDRenderLoop/SkyHDRI");
9391

94-
m_SkyboxCubemap = new RenderTexture(kSkyCubemapSize, kSkyCubemapSize, 1, RenderTextureFormat.ARGBHalf);
95-
m_SkyboxCubemap.dimension = TextureDimension.Cube;
96-
m_SkyboxCubemap.Create();
92+
m_SkyboxCubemapRT = new RenderTexture(kSkyCubemapSize, kSkyCubemapSize, 1, RenderTextureFormat.ARGBHalf);
93+
m_SkyboxCubemapRT.dimension = TextureDimension.Cube;
94+
m_SkyboxCubemapRT.useMipMap = true;
95+
m_SkyboxCubemapRT.autoGenerateMips = true;
96+
m_SkyboxCubemapRT.Create();
97+
98+
Matrix4x4 cubeProj = Matrix4x4.Perspective(90.0f, 1.0f, 0.1f, 1.0f);
99+
100+
Vector3[] lookAtList = {
101+
new Vector3(1.0f, 0.0f, 0.0f),
102+
new Vector3(-1.0f, 0.0f, 0.0f),
103+
new Vector3(0.0f, 1.0f, 0.0f),
104+
new Vector3(0.0f, -1.0f, 0.0f),
105+
new Vector3(0.0f, 0.0f, 1.0f),
106+
new Vector3(0.0f, 0.0f, -1.0f),
107+
};
108+
109+
Vector3[] UpVectorList = {
110+
new Vector3(0.0f, 1.0f, 0.0f),
111+
new Vector3(0.0f, 1.0f, 0.0f),
112+
new Vector3(0.0f, 0.0f, -1.0f),
113+
new Vector3(0.0f, 0.0f, 1.0f),
114+
new Vector3(0.0f, 1.0f, 0.0f),
115+
new Vector3(0.0f, 1.0f, 0.0f),
116+
};
117+
118+
for (int i = 0; i < 6; ++i)
119+
{
120+
m_CubemapFaceCamera[i] = new GameObject();
121+
m_CubemapFaceCamera[i].hideFlags = HideFlags.HideAndDontSave;
122+
123+
Camera camera = m_CubemapFaceCamera[i].AddComponent<Camera>();
124+
camera.projectionMatrix = cubeProj;
125+
Transform transform = camera.GetComponent<Transform>();
126+
transform.LookAt(lookAtList[i], UpVectorList[i]);
127+
}
97128
}
98129

99130
public void OnDisable()
100131
{
101-
Utilities.Destroy(m_SkyboxMaterial);
132+
Utilities.Destroy(m_StandardSkyboxMaterial);
102133
Utilities.Destroy(m_SkyHDRIMaterial);
134+
Utilities.Destroy(m_SkyboxCubemapRT);
103135

104-
//m_SkyboxCubemap.Release();
105-
Utilities.Destroy(m_SkyboxCubemap);
136+
for(int i = 0 ; i < 6 ; ++i)
137+
{
138+
Utilities.Destroy(m_CubemapFaceCamera[i]);
139+
}
106140

107141
}
108142

143+
private void RenderSky(Camera camera, SkyParameters skyParameters, bool forceUVBottom, RenderLoop renderLoop)
144+
{
145+
Mesh skyMesh = BuildSkyMesh(camera, forceUVBottom);
146+
147+
m_SkyHDRIMaterial.SetTexture("_Cubemap", skyParameters.skyHDRI);
148+
m_SkyHDRIMaterial.SetVector("_SkyParam", new Vector4(skyParameters.exposure, skyParameters.multiplier, skyParameters.rotation, 0.0f));
149+
150+
var cmd = new CommandBuffer { name = "Skybox" };
151+
cmd.DrawMesh(skyMesh, Matrix4x4.identity, m_SkyHDRIMaterial);
152+
renderLoop.ExecuteCommandBuffer(cmd);
153+
cmd.Dispose();
154+
}
155+
109156
public void RenderSky(Camera camera, SkyParameters skyParameters, RenderTargetIdentifier colorBuffer, RenderTargetIdentifier depthBuffer, RenderLoop renderLoop)
110157
{
111158
// Render sky into a cubemap - doesn't happen every frame, can be control
159+
for (int i = 0; i < 6; ++i)
160+
{
161+
Utilities.SetRenderTarget(renderLoop, m_SkyboxCubemapRT, "", 0, (CubemapFace)i);
162+
Camera faceCamera = m_CubemapFaceCamera[i].GetComponent<Camera>();
163+
RenderSky(faceCamera, skyParameters, true, renderLoop);
164+
}
165+
166+
m_StandardSkyboxMaterial.SetTexture("_Tex", m_SkyboxCubemapRT);
167+
RenderSettings.skybox = m_StandardSkyboxMaterial; // Setup this material as the default to be use in RenderSettings
168+
RenderSettings.ambientIntensity = 1.0f; // fix this to 1, this parameter should not exist!
169+
RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Skybox; // Force skybox for our HDRI
170+
RenderSettings.reflectionIntensity = 1.0f;
171+
DynamicGI.UpdateEnvironment();
112172

113173
// TODO: do a render to texture here
114174

@@ -118,18 +178,8 @@ public void RenderSky(Camera camera, SkyParameters skyParameters, RenderTargetId
118178
//m_SkyboxMaterial.SetTexture(cubemap);
119179

120180
// Render the sky itself
121-
122181
Utilities.SetRenderTarget(renderLoop, colorBuffer, depthBuffer, "Sky Pass");
123-
124-
Mesh skyMesh = BuildSkyMesh(camera);
125-
126-
m_SkyHDRIMaterial.SetTexture("_Cubemap", skyParameters.skyHDRI);
127-
m_SkyHDRIMaterial.SetVector("_SkyParam", new Vector4(skyParameters.exposure, skyParameters.multiplier, skyParameters.rotation, 0.0f));
128-
129-
var cmd = new CommandBuffer { name = "Skybox" };
130-
cmd.DrawMesh(skyMesh, Matrix4x4.identity, m_SkyHDRIMaterial);
131-
renderLoop.ExecuteCommandBuffer(cmd);
132-
cmd.Dispose();
182+
RenderSky(camera, skyParameters, false, renderLoop);
133183
}
134184
}
135185
}

0 commit comments

Comments
 (0)