Skip to content

Commit dc4507c

Browse files
- First version of sky renderer
- Added an Utilities class for re-usable methods in the renderloop (SetRenderTarget, Material creation, etc...)
1 parent bda45d5 commit dc4507c

File tree

8 files changed

+326
-138
lines changed

8 files changed

+326
-138
lines changed

Assets/ScriptableRenderLoop/HDRenderLoop/Editor/HDRenderLoopInspector.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ public override void OnInspectorGUI()
181181
skyParameters.skyHDRI = (Cubemap)EditorGUILayout.ObjectField("Cubemap", skyParameters.skyHDRI, typeof(Cubemap), false);
182182
skyParameters.exposure = Mathf.Max(Mathf.Min(EditorGUILayout.FloatField(styles.skyExposure, skyParameters.exposure), 32), -32);
183183
skyParameters.multiplier = Mathf.Max(EditorGUILayout.FloatField(styles.skyMultiplier, skyParameters.multiplier), 0);
184-
skyParameters.rotation = Mathf.Max(Mathf.Min(EditorGUILayout.FloatField(styles.skyRotation, skyParameters.rotation), 360), 0);
184+
skyParameters.rotation = Mathf.Max(Mathf.Min(EditorGUILayout.FloatField(styles.skyRotation, skyParameters.rotation), 360), -360);
185185

186186
if (EditorGUI.EndChangeCheck())
187187
{

Assets/ScriptableRenderLoop/HDRenderLoop/HDRenderLoop.cs

Lines changed: 40 additions & 127 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,7 @@ static void CreateHDRenderLoop()
2424

2525
#endif
2626

27-
public class SkyParameters
28-
{
29-
public Cubemap skyHDRI;
30-
public float rotation;
31-
public float exposure;
32-
public float multiplier;
33-
}
34-
27+
SkyRenderer m_SkyRenderer = null;
3528
[SerializeField]
3629
SkyParameters m_SkyParameters = new SkyParameters();
3730

@@ -82,7 +75,7 @@ public void InitGBuffers(int width, int height, CommandBuffer cmd)
8275
}
8376
}
8477

85-
public RenderTargetIdentifier[] GetGBuffers(CommandBuffer cmd)
78+
public RenderTargetIdentifier[] GetGBuffers()
8679
{
8780
var colorMRTs = new RenderTargetIdentifier[gbufferCount];
8881
for (int index = 0; index < gbufferCount; index++)
@@ -128,8 +121,6 @@ public void BindBuffers(Material mat)
128121
TextureSettings m_TextureSettings = TextureSettings.Default;
129122

130123
// Various set of material use in render loop
131-
Material m_SkyboxMaterial;
132-
Material m_SkyHDRIMaterial;
133124
Material m_DeferredMaterial;
134125
Material m_FinalPassMaterial;
135126
Material m_DebugViewMaterialGBuffer;
@@ -140,6 +131,12 @@ public void BindBuffers(Material mat)
140131
int s_VelocityBuffer;
141132
int s_DistortionBuffer;
142133

134+
RenderTargetIdentifier s_CameraColorBufferRT;
135+
RenderTargetIdentifier s_CameraDepthBufferRT;
136+
RenderTargetIdentifier s_VelocityBufferRT;
137+
RenderTargetIdentifier s_DistortionBufferRT;
138+
139+
143140
public class LightList
144141
{
145142
public List<DirectionalLightData> directionalLights;
@@ -174,31 +171,20 @@ void OnValidate()
174171
Rebuild();
175172
}
176173

177-
Material CreateEngineMaterial(string shaderPath)
178-
{
179-
var mat = new Material(Shader.Find(shaderPath) as Shader)
180-
{
181-
hideFlags = HideFlags.HideAndDontSave
182-
};
183-
return mat;
184-
}
185-
186174
public override void Rebuild()
187175
{
188176
s_CameraColorBuffer = Shader.PropertyToID("_CameraColorTexture");
189177
s_CameraDepthBuffer = Shader.PropertyToID("_CameraDepthTexture");
190178

191-
// TODO: We need to have an API to send our sky information to Enlighten. For now use a workaround through skybox/cubemap material...
192-
m_SkyboxMaterial = CreateEngineMaterial("Skybox/Cubemap");
193-
RenderSettings.skybox = m_SkyboxMaterial; // Setup this material as the default to be use in RenderSettings
194-
RenderSettings.ambientIntensity = 1.0f; // fix this to 1, this parameter should not exist!
195-
RenderSettings.ambientMode = UnityEngine.Rendering.AmbientMode.Skybox; // Force skybox for our HDRI
196-
RenderSettings.reflectionIntensity = 1.0f;
179+
s_CameraColorBufferRT = new RenderTargetIdentifier(s_CameraColorBuffer);
180+
s_CameraDepthBufferRT = new RenderTargetIdentifier(s_CameraDepthBuffer);
181+
182+
m_SkyRenderer = new SkyRenderer();
183+
m_SkyRenderer.Rebuild();
197184

198-
m_SkyHDRIMaterial = CreateEngineMaterial("Hidden/HDRenderLoop/SkyHDRI");
199-
m_DeferredMaterial = CreateEngineMaterial("Hidden/HDRenderLoop/Deferred");
200-
m_FinalPassMaterial = CreateEngineMaterial("Hidden/HDRenderLoop/FinalPass");
201-
m_DebugViewMaterialGBuffer = CreateEngineMaterial("Hidden/HDRenderLoop/DebugViewMaterialGBuffer");
185+
m_DeferredMaterial = Utilities.CreateEngineMaterial("Hidden/HDRenderLoop/Deferred");
186+
m_FinalPassMaterial = Utilities.CreateEngineMaterial("Hidden/HDRenderLoop/FinalPass");
187+
m_DebugViewMaterialGBuffer = Utilities.CreateEngineMaterial("Hidden/HDRenderLoop/DebugViewMaterialGBuffer");
202188

203189
m_ShadowPass = new ShadowRenderPass(m_ShadowSettings);
204190

@@ -222,9 +208,11 @@ public override void Rebuild()
222208
m_gbufferManager.SetBufferDescription(m_gbufferManager.gbufferCount, "_VelocityTexture", Builtin.RenderLoop.GetVelocityBufferFormat(), Builtin.RenderLoop.GetVelocityBufferReadWrite());
223209
m_gbufferManager.gbufferCount++;
224210
}
211+
s_VelocityBufferRT = new RenderTargetIdentifier(s_VelocityBuffer);
225212
#pragma warning restore 162
226213

227214
s_DistortionBuffer = Shader.PropertyToID("_DistortionTexture");
215+
s_DistortionBufferRT = new RenderTargetIdentifier(s_DistortionBuffer);
228216

229217
m_LitRenderLoop.Rebuild();
230218

@@ -247,16 +235,16 @@ void OnDisable()
247235
m_LitRenderLoop.OnDisable();
248236
m_SinglePassLightLoop.OnDisable();
249237
//m_TilePassLightLoop.OnDisable();
250-
251-
if (m_SkyboxMaterial) DestroyImmediate(m_SkyboxMaterial);
252-
if (m_SkyHDRIMaterial) DestroyImmediate(m_SkyHDRIMaterial);
253-
if (m_DeferredMaterial) DestroyImmediate(m_DeferredMaterial);
254-
if (m_FinalPassMaterial) DestroyImmediate(m_FinalPassMaterial);
255-
if (m_DebugViewMaterialGBuffer) DestroyImmediate(m_DebugViewMaterialGBuffer);
238+
239+
Utilities.Destroy(m_DeferredMaterial);
240+
Utilities.Destroy(m_FinalPassMaterial);
241+
Utilities.Destroy(m_DebugViewMaterialGBuffer);
256242

257243
m_CubeReflTexArray.Release();
258244
m_CookieTexArray.Release();
259245
m_CubeCookieTexArray.Release();
246+
247+
m_SkyRenderer.OnDisable();
260248
}
261249

262250
void NewFrame()
@@ -314,7 +302,7 @@ void InitAndClearBuffer(Camera camera, RenderLoop renderLoop)
314302
var cmd = new CommandBuffer();
315303
cmd.name = "Clear GBuffer";
316304
// Write into the Camera Depth buffer
317-
cmd.SetRenderTarget(m_gbufferManager.GetGBuffers(cmd), new RenderTargetIdentifier(s_CameraDepthBuffer));
305+
cmd.SetRenderTarget(m_gbufferManager.GetGBuffers(), new RenderTargetIdentifier(s_CameraDepthBuffer));
318306
// Clear everything
319307
// TODO: Clear is not required for color as we rewrite everything, will save performance.
320308
cmd.ClearRenderTarget(false, true, new Color(0, 0, 0, 0));
@@ -325,56 +313,28 @@ void InitAndClearBuffer(Camera camera, RenderLoop renderLoop)
325313
// END TEMP
326314
}
327315

328-
void RenderOpaqueNoLightingRenderList(CullResults cull, Camera camera, RenderLoop renderLoop, string passName)
316+
void RenderOpaqueRenderList(CullResults cull, Camera camera, RenderLoop renderLoop, string passName, RendererConfiguration rendererConfiguration = 0)
329317
{
330318
if (!debugParameters.displayOpaqueObjects)
331319
return;
332320

333321
var settings = new DrawRendererSettings(cull, camera, new ShaderPassName(passName))
334322
{
335-
rendererConfiguration = 0,
336-
sorting = { sortOptions = SortOptions.SortByMaterialThenMesh }
337-
};
338-
settings.inputFilter.SetQueuesOpaque();
339-
renderLoop.DrawRenderers(ref settings);
340-
}
341-
342-
void RenderOpaqueRenderList(CullResults cull, Camera camera, RenderLoop renderLoop, string passName)
343-
{
344-
if (!debugParameters.displayOpaqueObjects)
345-
return;
346-
347-
var settings = new DrawRendererSettings(cull, camera, new ShaderPassName(passName))
348-
{
349-
rendererConfiguration = RendererConfiguration.PerObjectLightProbe | RendererConfiguration.PerObjectReflectionProbes | RendererConfiguration.PerObjectLightmaps | RendererConfiguration.PerObjectLightProbeProxyVolume,
323+
rendererConfiguration = rendererConfiguration,
350324
sorting = { sortOptions = SortOptions.SortByMaterialThenMesh }
351325
};
352326
settings.inputFilter.SetQueuesOpaque();
353327
renderLoop.DrawRenderers(ref settings);
354328
}
355329

356-
void RenderTransparentNoLightingRenderList(CullResults cull, Camera camera, RenderLoop renderLoop, string passName)
357-
{
358-
if (!debugParameters.displayTransparentObjects)
359-
return;
360-
361-
var settings = new DrawRendererSettings(cull, camera, new ShaderPassName(passName))
362-
{
363-
rendererConfiguration = 0,
364-
sorting = { sortOptions = SortOptions.BackToFront }
365-
};
366-
settings.inputFilter.SetQueuesTransparent();
367-
renderLoop.DrawRenderers(ref settings);
368-
}
369-
370-
void RenderTransparentRenderList(CullResults cull, Camera camera, RenderLoop renderLoop, string passName)
330+
void RenderTransparentRenderList(CullResults cull, Camera camera, RenderLoop renderLoop, string passName, RendererConfiguration rendererConfiguration = 0)
371331
{
372332
if (!debugParameters.displayTransparentObjects)
373333
return;
374334

375335
var settings = new DrawRendererSettings(cull, camera, new ShaderPassName(passName))
376336
{
377-
rendererConfiguration = RendererConfiguration.PerObjectLightProbe | RendererConfiguration.PerObjectReflectionProbes | RendererConfiguration.PerObjectLightmaps | RendererConfiguration.PerObjectLightProbeProxyVolume,
337+
rendererConfiguration = rendererConfiguration,
378338
sorting = { sortOptions = SortOptions.BackToFront }
379339
};
380340
settings.inputFilter.SetQueuesTransparent();
@@ -395,7 +355,7 @@ void RenderDepthPrepass(CullResults cull, Camera camera, RenderLoop renderLoop)
395355
renderLoop.ExecuteCommandBuffer(cmd);
396356
cmd.Dispose();
397357

398-
RenderOpaqueNoLightingRenderList(cull, camera, renderLoop, "DepthOnly");
358+
RenderOpaqueRenderList(cull, camera, renderLoop, "DepthOnly");
399359
}
400360

401361
void RenderGBuffer(CullResults cull, Camera camera, RenderLoop renderLoop)
@@ -407,12 +367,12 @@ void RenderGBuffer(CullResults cull, Camera camera, RenderLoop renderLoop)
407367

408368
// setup GBuffer for rendering
409369
var cmd = new CommandBuffer { name = "GBuffer Pass" };
410-
cmd.SetRenderTarget(m_gbufferManager.GetGBuffers(cmd), new RenderTargetIdentifier(s_CameraDepthBuffer));
370+
cmd.SetRenderTarget(m_gbufferManager.GetGBuffers(), new RenderTargetIdentifier(s_CameraDepthBuffer));
411371
renderLoop.ExecuteCommandBuffer(cmd);
412372
cmd.Dispose();
413373

414374
// render opaque objects into GBuffer
415-
RenderOpaqueRenderList(cull, camera, renderLoop, "GBuffer");
375+
RenderOpaqueRenderList(cull, camera, renderLoop, "GBuffer", Utilities.kRendererConfigurationBakedLighting);
416376
}
417377

418378
// This pass is use in case of forward opaque and deferred rendering. We need to render forward objects before tile lighting pass
@@ -423,12 +383,12 @@ void RenderForwardOpaqueDepth(CullResults cull, Camera camera, RenderLoop render
423383
return;
424384

425385
// TODO: Use the render queue index to only send the forward opaque!
426-
var cmd = new CommandBuffer { name = "Depth Prepass" };
386+
var cmd = new CommandBuffer { name = "Depth Prepass" };
427387
cmd.SetRenderTarget(new RenderTargetIdentifier(s_CameraDepthBuffer));
428388
renderLoop.ExecuteCommandBuffer(cmd);
429389
cmd.Dispose();
430390

431-
RenderOpaqueNoLightingRenderList(cull, camera, renderLoop, "DepthOnly");
391+
RenderOpaqueRenderList(cull, camera, renderLoop, "DepthOnly");
432392
}
433393

434394
void RenderDebugViewMaterial(CullResults cull, Camera camera, RenderLoop renderLoop)
@@ -516,54 +476,7 @@ void RenderDeferredLighting(Camera camera, RenderLoop renderLoop)
516476

517477
void RenderSky(Camera camera, RenderLoop renderLoop)
518478
{
519-
/*
520-
// Render sky into a cubemap - doesn't happen every frame, can be control
521-
522-
// TODO: do a render to texture here
523-
524-
// Downsample the cubemap and provide it to Enlighten
525-
526-
// TODO: currently workaround is to set the cubemap in a Skybox/cubemap material
527-
//m_SkyboxMaterial.SetTexture(cubemap);
528-
529-
// Render the sky itself
530-
531-
Vector3[] vertData = new Vector3[4];
532-
vertData[0] = new Vector3(-1.0f, -1.0f, 0.0f);
533-
vertData[1] = new Vector3(1.0f, -1.0f, 0.0f);
534-
vertData[2] = new Vector3(1.0f, 1.0f, 0.0f);
535-
vertData[3] = new Vector3(-1.0f, 1.0f, 0.0f);
536-
537-
Vector3[] eyeVectorData = new Vector3[4];
538-
// camera.worldToCameraMatrix, camera.projectionMatrix
539-
// Get view vector vased on the frustrum, i.e (invert transform frustrum get position etc...)
540-
eyeVectorData[0] =
541-
eyeVectorData[1] =
542-
eyeVectorData[2] =
543-
eyeVectorData[3] =
544-
545-
// Write out the mesh
546-
var triangles = new int[4];
547-
for (int i = 0; i < 4; i++)
548-
{
549-
triangles[i] = i;
550-
}
551-
552-
Mesh mesh = new Mesh
553-
{
554-
vertices = vertData,
555-
normals = eyeVectorData,
556-
triangles = triangles
557-
};
558-
559-
m_SkyHDRIMaterial.SetTexture("_Cubemap", skyParameters.skyHDRI);
560-
m_SkyHDRIMaterial.SetVector("_SkyParam", new Vector4(skyParameters.exposure, skyParameters.multiplier, skyParameters.rotation, 0.0f));
561-
562-
var cmd = new CommandBuffer { name = "Skybox" };
563-
cmd.DrawMesh(mesh, Matrix4x4.identity, m_SkyHDRIMaterial);
564-
renderloop.ExecuteCommandBuffer(cmd);
565-
cmd.Dispose();
566-
*/
479+
m_SkyRenderer.RenderSky(camera, m_SkyParameters, s_CameraColorBufferRT, s_CameraDepthBufferRT, renderLoop);
567480
}
568481

569482
void RenderForward(CullResults cullResults, Camera camera, RenderLoop renderLoop)
@@ -581,7 +494,7 @@ void RenderForward(CullResults cullResults, Camera camera, RenderLoop renderLoop
581494
RenderOpaqueRenderList(cullResults, camera, renderLoop, "Forward");
582495
}
583496

584-
RenderTransparentRenderList(cullResults, camera, renderLoop, "Forward");
497+
RenderTransparentRenderList(cullResults, camera, renderLoop, "Forward", Utilities.kRendererConfigurationBakedLighting);
585498
}
586499

587500
void RenderForwardUnlit(CullResults cullResults, Camera camera, RenderLoop renderLoop)
@@ -594,8 +507,8 @@ void RenderForwardUnlit(CullResults cullResults, Camera camera, RenderLoop rende
594507
renderLoop.ExecuteCommandBuffer(cmd);
595508
cmd.Dispose();
596509

597-
RenderOpaqueNoLightingRenderList(cullResults, camera, renderLoop, "ForwardUnlit");
598-
RenderTransparentNoLightingRenderList(cullResults, camera, renderLoop, "ForwardUnlit");
510+
RenderOpaqueRenderList(cullResults, camera, renderLoop, "ForwardUnlit");
511+
RenderTransparentRenderList(cullResults, camera, renderLoop, "ForwardUnlit");
599512
}
600513

601514
void RenderVelocity(CullResults cullResults, Camera camera, RenderLoop renderLoop)
@@ -615,7 +528,7 @@ void RenderVelocity(CullResults cullResults, Camera camera, RenderLoop renderLoo
615528
renderLoop.ExecuteCommandBuffer(cmd);
616529
cmd.Dispose();
617530

618-
RenderOpaqueNoLightingRenderList(cullResults, camera, renderLoop, "MotionVectors");
531+
RenderOpaqueRenderList(cullResults, camera, renderLoop, "MotionVectors");
619532
#pragma warning restore 162, 429
620533
}
621534

@@ -631,7 +544,7 @@ void RenderDistortion(CullResults cullResults, Camera camera, RenderLoop renderL
631544
cmd.Dispose();
632545

633546
// Only transparent object can render distortion vectors
634-
RenderTransparentNoLightingRenderList(cullResults, camera, renderLoop, "DistortionVectors");
547+
RenderTransparentRenderList(cullResults, camera, renderLoop, "DistortionVectors");
635548
}
636549

637550

Assets/ScriptableRenderLoop/HDRenderLoop/Sky/Resources/SkyHDRI.shader

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ Shader "Hidden/HDRenderLoop/SkyHDRI"
55
Pass
66
{
77
ZWrite Off
8-
Blend SrcAlpha OneMinusSrcAlpha // We will lerp only the values that are valid
8+
ZTest LEqual
9+
Blend One Zero
910

1011
HLSLPROGRAM
1112
#pragma target 5.0
@@ -38,11 +39,6 @@ Shader "Hidden/HDRenderLoop/SkyHDRI"
3839
// TODO: implement SV_vertexID full screen quad
3940
Varyings output;
4041
output.positionCS = float4(input.positionCS.xy, UNITY_RAW_FAR_CLIP_VALUE
41-
#if UNITY_REVERSED_Z
42-
+ 0.000001
43-
#else
44-
- 0.000001
45-
#endif
4642
, 1.0);
4743
output.eyeVector = input.eyeVector;
4844

@@ -54,11 +50,11 @@ Shader "Hidden/HDRenderLoop/SkyHDRI"
5450
float3 dir = normalize(input.eyeVector);
5551

5652
// Rotate direction
57-
float phi = _SkyParam.z * PI / 180.0; // Convert to radiant
53+
float phi = DegToRad(_SkyParam.z);
5854
float cosPhi, sinPhi;
59-
sincos(phi, cosPhi, sinPhi);
60-
float3 rotDirX = float3(cosPhi, 0, sinPhi);
61-
float3 rotDirY = float3(sinPhi, 0, -cosPhi);
55+
sincos(phi, sinPhi, cosPhi);
56+
float3 rotDirX = float3(cosPhi, 0, -sinPhi);
57+
float3 rotDirY = float3(sinPhi, 0, cosPhi);
6258
dir = float3(dot(rotDirX, dir), dir.y, dot(rotDirY, dir));
6359

6460
return ClampToFloat16Max(SAMPLE_TEXTURECUBE_LOD(_Cubemap, sampler_Cubemap, dir, 0) * exp2(_SkyParam.x) * _SkyParam.y);

0 commit comments

Comments
 (0)