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
1 change: 1 addition & 0 deletions com.unity.render-pipelines.high-definition/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Fix for assertion triggering sometimes when saving a newly created lit shader graph (case 1230996)
- Fixed culling of planar reflection probes that change position (case 1218651)
- Fixed null reference when processing lightprobe (case 1235285)
- Fix issue causing wrong planar reflection rendering when more than one camera is present.

### Changed
- Color buffer pyramid is not allocated anymore if neither refraction nor distortion are enabled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,11 @@ public Texture SetTexture(ProbeSettings.Mode targetMode, Texture texture)
/// </summary>
public RenderData renderData => GetRenderData(mode);
/// <summary>
/// Get the render data of a specific mode
/// Get the render data of a specific mode.
///
/// Note: The HDProbe stores only one RenderData per mode, even for view dependent probes with multiple viewers.
/// In that case, make sure that you have set the RenderData relative to the expected viewer before rendering.
/// Otherwise the data retrieved by this function will be wrong.
/// </summary>
/// <param name="targetMode">The mode to query</param>
/// <returns>The requested render data</returns>
Expand All @@ -264,7 +268,10 @@ public RenderData GetRenderData(ProbeSettings.Mode targetMode)
}
}
/// <summary>
/// Set the render data for a specific mode
/// Set the render data for a specific mode.
///
/// Note: The HDProbe stores only one RenderData per mode, even for view dependent probes with multiple viewers.
/// In that case, make sure that you have set the RenderData relative to the expected viewer before rendering.
/// </summary>
/// <param name="targetMode">The mode to update</param>
/// <param name="renderData">The data to set</param>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1176,6 +1176,7 @@ public struct Target
// Indices of render request to render before this one
public List<int> dependsOnRenderRequestIndices;
public CameraSettings cameraSettings;
public List<(HDProbe.RenderData, HDProbe)> viewDependentProbesData;
}
struct HDCullingResults
{
Expand Down Expand Up @@ -1395,7 +1396,8 @@ protected override void Render(ScriptableRenderContext renderContext, Camera[] c
},
dependsOnRenderRequestIndices = ListPool<int>.Get(),
index = renderRequests.Count,
cameraSettings = CameraSettings.From(hdCamera)
cameraSettings = CameraSettings.From(hdCamera),
viewDependentProbesData = ListPool<(HDProbe.RenderData, HDProbe)>.Get()
// TODO: store DecalCullResult
};
renderRequests.Add(request);
Expand Down Expand Up @@ -1479,15 +1481,25 @@ float ComputeVisibility(int visibleInIndex, HDProbe visibleProbe)

parentCamera = visibleInRenderRequest.hdCamera.camera;

var renderDatas = ListPool<HDProbe.RenderData>.Get();

AddHDProbeRenderRequests(
visibleProbe,
viewerTransform,
new List<(int index, float weight)>{visibility},
HDUtils.GetSceneCullingMaskFromCamera(visibleInRenderRequest.hdCamera.camera),
parentCamera,
visibleInRenderRequest.hdCamera.camera.fieldOfView,
visibleInRenderRequest.hdCamera.camera.aspect
visibleInRenderRequest.hdCamera.camera.aspect,
ref renderDatas
);

foreach (var renderData in renderDatas)
{
visibleInRenderRequest.viewDependentProbesData.Add((renderData, visibleProbe));
}

ListPool<HDProbe.RenderData>.Release(renderDatas);
}
}
else
Expand All @@ -1502,7 +1514,11 @@ float ComputeVisibility(int visibleInIndex, HDProbe visibleProbe)
visibleInOneViewer = true;
}
if (visibleInOneViewer)
AddHDProbeRenderRequests(visibleProbe, null, visibilities, 0, parentCamera);
{
var renderDatas = ListPool<HDProbe.RenderData>.Get();
AddHDProbeRenderRequests(visibleProbe, null, visibilities, 0, parentCamera, referenceFieldOfView: 90, referenceAspect: 1, ref renderDatas);
ListPool<HDProbe.RenderData>.Release(renderDatas);
}
}
}
foreach (var pair in renderRequestIndicesWhereTheProbeIsVisible)
Expand All @@ -1516,8 +1532,9 @@ void AddHDProbeRenderRequests(
List<(int index, float weight)> visibilities,
ulong overrideSceneCullingMask,
Camera parentCamera,
float referenceFieldOfView = 90,
float referenceAspect = 1
float referenceFieldOfView,
float referenceAspect,
ref List<HDProbe.RenderData> renderDatas
)
{
var position = ProbeCapturePositionSettings.ComputeFrom(
Expand Down Expand Up @@ -1616,16 +1633,20 @@ ref _cullingResults
if (!visibleProbe.realtimeTexture.IsCreated())
visibleProbe.realtimeTexture.Create();

visibleProbe.SetRenderData(
ProbeSettings.Mode.Realtime,
new HDProbe.RenderData(
var renderData = new HDProbe.RenderData(
camera.worldToCameraMatrix,
camera.projectionMatrix,
camera.transform.position,
camera.transform.rotation,
cameraSettings[j].frustum.fieldOfView,
cameraSettings[j].frustum.aspect
)
);

renderDatas.Add(renderData);

visibleProbe.SetRenderData(
ProbeSettings.Mode.Realtime,
renderData
);

// TODO: Assign the actual final target to render to.
Expand All @@ -1642,7 +1663,8 @@ ref _cullingResults
clearCameraSettings = true,
dependsOnRenderRequestIndices = ListPool<int>.Get(),
index = renderRequests.Count,
cameraSettings = cameraSettings[j]
cameraSettings = cameraSettings[j],
viewDependentProbesData = ListPool<(HDProbe.RenderData, HDProbe)>.Get()
// TODO: store DecalCullResult
};

Expand Down Expand Up @@ -1765,6 +1787,15 @@ ref _cullingResults
target.id = m_TemporaryTargetForCubemaps;
}

// The HDProbe store only one RenderData per probe, however RenderData can be view dependent (e.g. planar probes).
// To avoid that the render data for the wrong view is used, we previously store a copy of the render data
// for each viewer and we are going to set it on the probe right before said viewer is rendered.
foreach (var probeDataPair in renderRequest.viewDependentProbesData)
{
var probe = probeDataPair.Item2;
var probeRenderData = probeDataPair.Item1;
probe.SetRenderData(ProbeSettings.Mode.Realtime, probeRenderData);
}

// var aovRequestIndex = 0;
foreach (var aovRequest in renderRequest.hdCamera.aovRequests)
Expand Down Expand Up @@ -1804,6 +1835,7 @@ ref _cullingResults
renderRequest.hdCamera.camera.targetTexture = null;

ListPool<int>.Release(renderRequest.dependsOnRenderRequestIndices);
ListPool<(HDProbe.RenderData, HDProbe)>.Release(renderRequest.viewDependentProbesData);

// Culling results can be shared between render requests: clear only when required
if (!skipClearCullingResults.Contains(renderRequest.index))
Expand Down