Skip to content

Commit 4f0b219

Browse files
HDRenderLoop: Commit second draft, need testing
1 parent 073d986 commit 4f0b219

File tree

9 files changed

+1233
-1375
lines changed

9 files changed

+1233
-1375
lines changed

Assets/ScriptableRenderLoop/HDRenderLoop/Editor/HDRenderLoopInspector.cs

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,11 @@ private class Styles
4646

4747
public readonly GUIContent tileLightLoopSettings = new GUIContent("Tile Light Loop settings");
4848
public readonly string[] tileLightLoopDebugTileFlagStrings = new string[] { "Direct Light", "Reflection Light", "Area Light"};
49-
public readonly GUIContent directIndirectSinglePass = new GUIContent("Enable direct and indirect lighting in single pass", "Toggle");
49+
public readonly GUIContent splitLightEvaluation = new GUIContent("Enable direct and indirect lighting in single pass", "Toggle");
5050
public readonly GUIContent bigTilePrepass = new GUIContent("Enable big tile prepass", "Toggle");
5151
public readonly GUIContent clustered = new GUIContent("Enable clustered", "Toggle");
52+
public readonly GUIContent disableTileAndCluster = new GUIContent("Disable Tile/clustered", "Toggle");
53+
5254

5355

5456
public readonly GUIContent textureSettings = new GUIContent("texture Settings");
@@ -265,16 +267,19 @@ public override void OnInspectorGUI()
265267

266268
EditorGUILayout.Space();
267269

268-
if (renderLoop.tilePassLightLoop != null)
270+
// TODO: we should call a virtual method or something similar to setup the UI, inspector should not know about it
271+
TilePass tilePass = renderLoop.lightLoop as TilePass;
272+
if (tilePass != null)
269273
{
270274
EditorGUILayout.LabelField(styles.tileLightLoopSettings);
271275
EditorGUI.indentLevel++;
272276
EditorGUI.BeginChangeCheck();
273277

274-
renderLoop.tilePassLightLoop.debugViewTilesFlags = EditorGUILayout.MaskField("DebugView Tiles", renderLoop.tilePassLightLoop.debugViewTilesFlags, styles.tileLightLoopDebugTileFlagStrings);
275-
renderLoop.tilePassLightLoop.enableDirectIndirectSinglePass = EditorGUILayout.Toggle(styles.directIndirectSinglePass, renderLoop.tilePassLightLoop.enableDirectIndirectSinglePass);
276-
renderLoop.tilePassLightLoop.enableBigTilePrepass = EditorGUILayout.Toggle(styles.bigTilePrepass, renderLoop.tilePassLightLoop.enableBigTilePrepass);
277-
renderLoop.tilePassLightLoop.enableClustered = EditorGUILayout.Toggle(styles.clustered, renderLoop.tilePassLightLoop.enableClustered);
278+
tilePass.debugViewTilesFlags = EditorGUILayout.MaskField("DebugView Tiles", tilePass.debugViewTilesFlags, styles.tileLightLoopDebugTileFlagStrings);
279+
tilePass.enableSplitLightEvaluation = EditorGUILayout.Toggle(styles.directSplitLightEvaluation, tilePass.enableSplitLightEvaluation);
280+
tilePass.enableBigTilePrepass = EditorGUILayout.Toggle(styles.bigTilePrepass, tilePass.enableBigTilePrepass);
281+
tilePass.enableClustered = EditorGUILayout.Toggle(styles.clustered, tilePass.enableClustered);
282+
tilePass.disableTileAndCluster = EditorGUILayout.Toggle(styles.disableTileAndCluster, tilePass.disableTileAndCluster);
278283

279284
if (EditorGUI.EndChangeCheck())
280285
{

Assets/ScriptableRenderLoop/HDRenderLoop/HDRenderLoop.cs

Lines changed: 34 additions & 228 deletions
Large diffs are not rendered by default.

Assets/ScriptableRenderLoop/HDRenderLoop/Lighting/LightDefinition.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public struct LightData
5959
[GenerateHLSL]
6060
public struct DirectionalLightData
6161
{
62-
public Vector3 direction;
62+
public Vector3 forward;
6363
public float diffuseScale;
6464

6565
public Vector3 up;

Assets/ScriptableRenderLoop/HDRenderLoop/Lighting/LightLoop.cs

Lines changed: 14 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -7,145 +7,28 @@ namespace UnityEngine.Experimental.ScriptableRenderLoop
77
{
88
public class LightLoop
99
{
10-
public virtual string GetKeyword()
11-
{
12-
return "";
13-
}
10+
// TODO: We should rather put the texture settings in LightLoop, but how do we serialize it ?
11+
public virtual void Rebuild(TextureSettings textureSettings) {}
1412

15-
public virtual void Rebuild()
16-
{
17-
m_lightList = new LightList();
13+
public virtual void Cleanup() {}
1814

19-
s_DirectionalLights = new ComputeBuffer(HDRenderLoop.k_MaxDirectionalLightsOnSCreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(DirectionalLightData)));
20-
s_DirectionalShadowList = new ComputeBuffer(HDRenderLoop.k_MaxCascadeCount, System.Runtime.InteropServices.Marshal.SizeOf(typeof(DirectionalShadowData)));
21-
s_PunctualLightList = new ComputeBuffer(HDRenderLoop.k_MaxPunctualLightsOnSCreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(LightData)));
22-
s_AreaLightList = new ComputeBuffer(HDRenderLoop.k_MaxAreaLightsOnSCreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(LightData)));
23-
s_EnvLightList = new ComputeBuffer(HDRenderLoop.k_MaxEnvLightsOnSCreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(EnvLightData)));
24-
s_PunctualShadowList = new ComputeBuffer(HDRenderLoop.k_MaxShadowOnScreen, System.Runtime.InteropServices.Marshal.SizeOf(typeof(PunctualShadowData)));
15+
public virtual bool NeedResize() { return false; }
2516

26-
m_CookieTexArray = new TextureCache2D();
27-
m_CookieTexArray.AllocTextureArray(8, m_TextureSettings.spotCookieSize, m_TextureSettings.spotCookieSize, TextureFormat.RGBA32, true);
28-
m_CubeCookieTexArray = new TextureCacheCubemap();
29-
m_CubeCookieTexArray.AllocTextureArray(4, m_TextureSettings.pointCookieSize, TextureFormat.RGBA32, true);
30-
m_CubeReflTexArray = new TextureCacheCubemap();
31-
m_CubeReflTexArray.AllocTextureArray(32, m_TextureSettings.reflectionCubemapSize, TextureFormat.BC6H, true);
32-
}
17+
public virtual void AllocResolutionDependentBuffers(int width, int height) { }
3318

34-
public virtual void Cleanup()
35-
{
36-
Utilities.SafeRelease(s_DirectionalLights);
37-
Utilities.SafeRelease(s_DirectionalShadowList);
38-
Utilities.SafeRelease(s_PunctualLightList);
39-
Utilities.SafeRelease(s_AreaLightList);
40-
Utilities.SafeRelease(s_EnvLightList);
41-
Utilities.SafeRelease(s_PunctualShadowList);
19+
public virtual void ReleaseResolutionDependentBuffers() {}
4220

43-
if (m_CubeReflTexArray != null)
44-
{
45-
m_CubeReflTexArray.Release();
46-
m_CubeReflTexArray = null;
47-
}
48-
if (m_CookieTexArray != null)
49-
{
50-
m_CookieTexArray.Release();
51-
m_CookieTexArray = null;
52-
}
53-
if (m_CubeCookieTexArray != null)
54-
{
55-
m_CubeCookieTexArray.Release();
56-
m_CubeCookieTexArray = null;
57-
}
58-
}
21+
public virtual void NewFrame() {}
5922

60-
virtual void NewFrame()
61-
{
62-
m_CookieTexArray.NewFrame();
63-
m_CubeCookieTexArray.NewFrame();
64-
m_CubeReflTexArray.NewFrame();
65-
}
23+
public virtual void PrepareLightsForGPU(CullResults cullResults, Camera camera, ref ShadowOutput shadowOutput) { }
24+
25+
// TODO: this should not be aprt of the interface but for now make something working
26+
public virtual void BuildGPULightLists(Camera camera, RenderLoop loop, RenderTargetIdentifier cameraDepthBufferRT) { }
6627

67-
68-
69-
public ShadowData GetShadowData(VisibleLight light, AdditionalLightData additionalData, int lightIndex, ref ShadowOutput shadowOutput)
70-
{
71-
bool hasDirectionalShadows = light.light.shadows != LightShadows.None && shadowOutput.GetShadowSliceCountLightIndex(lightIndex) != 0;
72-
73-
if (hasDirectionalShadows)
74-
{
75-
for (int sliceIndex = 0; sliceIndex < shadowOutput.GetShadowSliceCountLightIndex(lightIndex); ++sliceIndex)
76-
{
77-
ShadowData shadowData = new ShadowData();
78-
79-
int shadowSliceIndex = shadowOutput.GetShadowSliceIndex(lightIndex, sliceIndex);
80-
shadowData.worldToShadow = shadowOutput.shadowSlices[shadowSliceIndex].shadowTransform.transpose; // Transpose for hlsl reading ?
81-
shadowData.lightType = lightData.lightType;
82-
83-
shadowData.bias = light.light.shadowBias;
84-
85-
m_lightList.directionalShadows.Add(shadowData);
86-
}
87-
}
88-
}
89-
90-
public DirectionalLightData GetDirectionalLightData(VisibleLight light, AdditionalLightData additionalData)
91-
{
92-
Debug.Assert(light.lightType == LightType.Directional);
93-
94-
var directionalLightData = new DirectionalLightData();
95-
// Light direction for directional and is opposite to the forward direction
96-
directionalLightData.direction = -light.light.transform.forward;
97-
// up and right are use for cookie
98-
directionalLightData.up = light.light.transform.up;
99-
directionalLightData.right = light.light.transform.right;
100-
directionalLightData.positionWS = light.light.transform.position;
101-
directionalLightData.color = GetLightColor(light);
102-
directionalLightData.diffuseScale = additionalData.affectDiffuse ? 1.0f : 0.0f;
103-
directionalLightData.specularScale = additionalData.affectSpecular ? 1.0f : 0.0f;
104-
directionalLightData.invScaleX = 1.0f / light.light.transform.localScale.x;
105-
directionalLightData.invScaleY = 1.0f / light.light.transform.localScale.y;
106-
directionalLightData.cosAngle = 0.0f;
107-
directionalLightData.sinAngle = 0.0f;
108-
directionalLightData.shadowIndex = -1;
109-
directionalLightData.cookieIndex = -1;
110-
111-
if (light.light.cookie != null)
112-
{
113-
directionalLightData.tileCookie = (light.light.cookie.wrapMode == TextureWrapMode.Repeat);
114-
directionalLightData.cookieIndex = m_CookieTexArray.FetchSlice(light.light.cookie);
115-
}
116-
117-
directionalLightData.shadowIndex = 0;
118-
}
119-
120-
public virtual void PrepareLightsForGPU(CullResults cullResults, Camera camera) { }
121-
122-
public virtual void PushGlobalParams(Camera camera, RenderLoop loop)
123-
{
124-
Shader.SetGlobalTexture("_CookieTextures", m_CookieTexArray.GetTexCache());
125-
Shader.SetGlobalTexture("_CookieCubeTextures", m_CubeCookieTexArray.GetTexCache());
126-
Shader.SetGlobalTexture("_EnvTextures", m_CubeReflTexArray.GetTexCache());
127-
128-
s_DirectionalLights.SetData(m_lightList.directionalLights.ToArray());
129-
s_DirectionalShadowList.SetData(m_lightList.directionalShadows.ToArray());
130-
s_PunctualLightList.SetData(m_lightList.punctualLights.ToArray());
131-
s_AreaLightList.SetData(m_lightList.areaLights.ToArray());
132-
s_EnvLightList.SetData(m_lightList.envLights.ToArray());
133-
s_PunctualShadowList.SetData(m_lightList.punctualShadows.ToArray());
134-
135-
Shader.SetGlobalBuffer("_DirectionalLightList", s_DirectionalLights);
136-
Shader.SetGlobalInt("_DirectionalLightCount", m_lightList.directionalLights.Count);
137-
Shader.SetGlobalBuffer("_DirectionalShadowList", s_DirectionalShadowList);
138-
Shader.SetGlobalBuffer("_PunctualLightList", s_PunctualLightList);
139-
Shader.SetGlobalInt("_PunctualLightCount", m_lightList.punctualLights.Count);
140-
Shader.SetGlobalBuffer("_AreaLightList", s_AreaLightList);
141-
Shader.SetGlobalInt("_AreaLightCount", m_lightList.areaLights.Count);
142-
Shader.SetGlobalBuffer("_PunctualShadowList", s_PunctualShadowList);
143-
Shader.SetGlobalBuffer("_EnvLightList", s_EnvLightList);
144-
Shader.SetGlobalInt("_EnvLightCount", m_lightList.envLights.Count);
145-
146-
Shader.SetGlobalVectorArray("_DirShadowSplitSpheres", m_lightList.directionalShadowSplitSphereSqr);
147-
}
28+
public virtual void PushGlobalParams(Camera camera, RenderLoop loop) {}
14829

14930
public virtual void RenderDeferredLighting(Camera camera, RenderLoop renderLoop, RenderTargetIdentifier cameraColorBufferRT) {}
31+
32+
public virtual void RenderForward(Camera camera, RenderLoop renderLoop, bool renderOpaque) {}
15033
}
15134
}

Assets/ScriptableRenderLoop/HDRenderLoop/Lighting/SinglePass/SinglePass.cs.meta renamed to Assets/ScriptableRenderLoop/HDRenderLoop/Lighting/LightLoop.cs.meta

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/ScriptableRenderLoop/HDRenderLoop/Lighting/SinglePass/SinglePass.cs

Lines changed: 0 additions & 71 deletions
This file was deleted.

0 commit comments

Comments
 (0)