Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ Camera GetNextCamera()

void SetCameraIndex(int index)
{
if (index > 0 || index < GetCameraCount())
if (index > 0 && index < GetCameraCount())
{
m_CurrentCameraIndex = index;

Expand Down
4 changes: 4 additions & 0 deletions com.unity.render-pipelines.high-definition/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Added CustomPassUtils API to simplify Blur, Copy and DrawRenderers custom passes.
- Added Histogram guided automatic exposure.
- Added few exposure debug modes.
- Added support for multiple path-traced views at once (e.g., scene and game views).

### Fixed
- Fix when rescale probe all direction below zero (1219246)
Expand Down Expand Up @@ -620,6 +621,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Fixed Wizard check on default volume profile to also check it is not the default one in package.
- Fix erroneous central depth sampling in TAA.
- Fixed light layers not correctly disabled when the lightlayers is set to Nothing and Lightlayers isn't enabled in HDRP Asset
- Fixed a wrong condition in CameraSwitcher, potentially causing out of bound exceptions.
- Fixed an issue where editing the Look Dev default profile would not reflect directly in the Look Dev window.

### Changed
- Improve MIP selection for decals on Transparents
Expand Down Expand Up @@ -752,6 +755,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Slightly changed the TAA anti-flicker mechanism so that it is more aggressive on almost static images (only on High preset for now).
- Changed default exposure compensation to 0.
- Refactored shadow caching system.
- Removed experimental namespace for ray tracing code.

## [7.1.1] - 2019-09-05

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -536,7 +536,7 @@ static class UnlitKeywords
static class UnlitIncludes
{
const string kPassForwardUnlit = "Packages/com.unity.render-pipelines.high-definition/Runtime/RenderPipeline/ShaderPass/ShaderPassForwardUnlit.hlsl";

public static IncludeCollection Meta = new IncludeCollection
{
{ CoreIncludes.CorePregraph },
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -449,9 +449,9 @@ Shader "Hidden/HDRP/DebugExposure"
}

int displayTextOffsetX = DEBUG_FONT_TEXT_WIDTH;
int2 textLocation = int2(_MousePixelCoord.x + displayTextOffsetX, _MousePixelCoord.y);
uint2 textLocation = uint2(_MousePixelCoord.x + displayTextOffsetX, _MousePixelCoord.y);
DrawFloatExplicitPrecision(indicatorEV, textColor, unormCoord, 1, textLocation, outputColor.rgb);
textLocation = _MousePixelCoord.xy;
textLocation = uint2(_MousePixelCoord.xy);
DrawCharacter('X', float3(0.0f, 0.0f, 0.0f), unormCoord, textLocation, outputColor.rgb);

return outputColor;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
using UnityEngine.Rendering;
using UnityEngine.Rendering.HighDefinition;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Experimental.Rendering.HighDefinition;

namespace UnityEngine.Experimental.Rendering.HighDefinition
namespace UnityEngine.Rendering.HighDefinition
{
class SSGIDenoiser
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using UnityEngine.Experimental.Rendering;
using UnityEngine.Experimental.Rendering.HighDefinition;

namespace UnityEngine.Rendering.HighDefinition
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using System;
using UnityEngine.Experimental.Rendering;
using UnityEngine.Experimental.Rendering.HighDefinition;

namespace UnityEngine.Rendering.HighDefinition
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using UnityEngine.Experimental.Rendering;
using UnityEngine.Experimental.Rendering.HighDefinition;

namespace UnityEngine.Rendering.HighDefinition
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
using System;
using System.Linq;
using System.Collections.Generic;
using UnityEngine.Experimental.Rendering;

#if UNITY_EDITOR
Expand All @@ -7,12 +9,30 @@

namespace UnityEngine.Rendering.HighDefinition
{
// Struct storing per-camera data, to handle accumulation and dirtiness
internal struct CameraData
{
public void ResetIteration()
{
accumulatedWeight = 0.0f;
currentIteration = 0;
}

public uint width;
public uint height;
public bool skyEnabled;
public bool fogEnabled;

public float accumulatedWeight;
public uint currentIteration;
}

// Helper class to manage time-scale in Unity when recording multi-frame sequences where one final frame is an accumulation of multiple sub-frames
internal class SubFrameManager
{
// Shutter settings
float m_ShutterInterval = 0.0f;
bool m_Centered = true;
bool m_Centered = true;
float m_ShutterFullyOpen = 0.0f;
float m_ShutterBeginsClosing = 1.0f;

Expand All @@ -21,8 +41,26 @@ internal class SubFrameManager
// Internal state
float m_OriginalTimeScale = 0;
float m_OriginalFixedDeltaTime = 0;
bool m_IsRenderingTheFirstFrame = true;
float m_AccumulatedWeight = 0;
bool m_IsRenderingTheFirstFrame = true;

// Per-camera data cache
Dictionary<int, CameraData> m_CameraCache = new Dictionary<int, CameraData>();

internal CameraData GetCameraData(int camID)
{
CameraData camData;
if (!m_CameraCache.TryGetValue(camID, out camData))
{
camData.ResetIteration();
m_CameraCache.Add(camID, camData);
}
return camData;
}

internal void SetCameraData(int camID, CameraData camData)
{
m_CameraCache[camID] = camData;
}

// The number of sub-frames that will be used to reconstruct a converged frame
public uint subFrameCount
Expand All @@ -32,13 +70,6 @@ public uint subFrameCount
}
uint m_AccumulationSamples = 0;

// The sequence number of the current sub-frame
public uint iteration
{
get { return m_CurrentIteration; }
}
uint m_CurrentIteration = 0;

// True when a recording session is in progress
public bool isRecording
{
Expand All @@ -47,18 +78,32 @@ public bool isRecording
bool m_IsRecording = false;

// Resets the sub-frame sequence
internal void Reset(int camID)
{
CameraData camData = GetCameraData(camID);
camData.ResetIteration();
SetCameraData(camID, camData);
}
internal void Reset()
{
m_CurrentIteration = 0;
m_AccumulatedWeight = 0;
foreach (int camID in m_CameraCache.Keys.ToList())
Reset(camID);
}

// Advances the sub-frame sequence
internal void Advance()
internal void Clear()
{
// Increment the iteration counter, if we haven't converged yet
if (m_CurrentIteration < m_AccumulationSamples)
m_CurrentIteration++;
m_CameraCache.Clear();
}
internal void SelectiveReset(uint maxSamples)
{
foreach (int camID in m_CameraCache.Keys.ToList())
{
CameraData camData = GetCameraData(camID);
if (camData.currentIteration >= maxSamples)
{
camData.ResetIteration();
SetCameraData(camID, camData);
}
}
}

void Init(int samples, float shutterInterval)
Expand All @@ -67,13 +112,14 @@ void Init(int samples, float shutterInterval)
m_ShutterInterval = samples > 1 ? shutterInterval : 0;
m_IsRecording = true;
m_IsRenderingTheFirstFrame = true;
Reset();

Clear();

m_OriginalTimeScale = Time.timeScale;

Time.timeScale = m_OriginalTimeScale * m_ShutterInterval / m_AccumulationSamples;

if (m_Centered && m_IsRenderingTheFirstFrame)
if (m_Centered)
{
Time.timeScale *= 0.5f;
}
Expand Down Expand Up @@ -108,12 +154,15 @@ internal void EndRecording()
// Should be called before rendering a new frame in a sequence (when accumulation is desired)
internal void PrepareNewSubFrame()
{
if (m_CurrentIteration == m_AccumulationSamples)
uint maxIteration = 0;
foreach (int camID in m_CameraCache.Keys.ToList())
maxIteration = Math.Max(maxIteration, GetCameraData(camID).currentIteration);

if (maxIteration == m_AccumulationSamples)
{
Reset();
}

if (m_CurrentIteration == m_AccumulationSamples - 1)
else if (maxIteration == m_AccumulationSamples - 1)
{
Time.timeScale = m_OriginalTimeScale * (1.0f - m_ShutterInterval);
m_IsRenderingTheFirstFrame = false;
Expand Down Expand Up @@ -167,24 +216,23 @@ float ShutterProfile(float time)
// y: sum of weights until now, without the current frame
// z: one over the sum of weights until now, including the current frame
// w: unused
internal Vector4 GetFrameWeights()
internal Vector4 ComputeFrameWeights(int camID)
{
float totalWeight = m_AccumulatedWeight;
float time = m_AccumulationSamples > 0 ? (float) m_CurrentIteration / m_AccumulationSamples : 0.0f;
CameraData camData = GetCameraData(camID);

float totalWeight = camData.accumulatedWeight;
float time = m_AccumulationSamples > 0 ? (float) camData.currentIteration / m_AccumulationSamples : 0.0f;

float weight = isRecording ? ShutterProfile(time) : 1.0f;

if (m_CurrentIteration < m_AccumulationSamples)
m_AccumulatedWeight += weight;
if (camData.currentIteration < m_AccumulationSamples)
camData.accumulatedWeight += weight;

if (m_AccumulatedWeight > 0)
{
return new Vector4(weight, totalWeight, 1.0f / m_AccumulatedWeight, 0.0f);
}
else
{
return new Vector4(weight, totalWeight, 0.0f, 0.0f);
}
SetCameraData(camID, camData);

return (camData.accumulatedWeight > 0) ?
new Vector4(weight, totalWeight, 1.0f / camData.accumulatedWeight, 0.0f) :
new Vector4(weight, totalWeight, 0.0f, 0.0f);
}
}

Expand Down Expand Up @@ -246,20 +294,28 @@ void RenderAccumulation(HDCamera hdCamera, CommandBuffer cmd, RTHandle inputText
if (!accumulationShader)
return;

uint currentIteration = m_SubFrameManager.iteration;
// Get the per-camera data
int camID = hdCamera.camera.GetInstanceID();
Vector4 frameWeights = m_SubFrameManager.ComputeFrameWeights(camID);
CameraData camData = m_SubFrameManager.GetCameraData(camID);

// Accumulate the path tracing results
int kernel = accumulationShader.FindKernel("KMain");
cmd.SetGlobalInt(HDShaderIDs._AccumulationFrameIndex, (int)currentIteration);
cmd.SetGlobalInt(HDShaderIDs._AccumulationFrameIndex, (int)camData.currentIteration);
cmd.SetGlobalInt(HDShaderIDs._AccumulationNumSamples, (int)m_SubFrameManager.subFrameCount);
cmd.SetComputeTextureParam(accumulationShader, kernel, HDShaderIDs._AccumulatedFrameTexture, history);
cmd.SetComputeTextureParam(accumulationShader, kernel, HDShaderIDs._CameraColorTextureRW, outputTexture);
cmd.SetComputeTextureParam(accumulationShader, kernel, HDShaderIDs._RadianceTexture, inputTexture);
cmd.SetComputeVectorParam(accumulationShader, HDShaderIDs._AccumulationWeights, m_SubFrameManager.GetFrameWeights());
cmd.SetComputeVectorParam(accumulationShader, HDShaderIDs._AccumulationWeights, frameWeights);
cmd.SetComputeIntParam(accumulationShader, HDShaderIDs._AccumulationNeedsExposure, needsExposure ? 1 : 0);
cmd.DispatchCompute(accumulationShader, kernel, (hdCamera.actualWidth + 7) / 8, (hdCamera.actualHeight + 7) / 8, hdCamera.viewCount);

m_SubFrameManager.Advance();
// Increment the iteration counter, if we haven't converged yet
if (camData.currentIteration < m_SubFrameManager.subFrameCount)
{
camData.currentIteration++;
m_SubFrameManager.SetCameraData(camID, camData);
}
}
}

Expand Down
Loading