Skip to content

Commit

Permalink
HdxRenderTaskParams: adding useAovMultiSample flag and explicitly set…
Browse files Browse the repository at this point in the history
…ting it for the OIT tasks instead of setting it inside the OIT tasks.

(Internal change: 2149248)
  • Loading branch information
unhyperbolic authored and pixar-oss committed Feb 19, 2021
1 parent 21e9418 commit 83aa020
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 14 deletions.
3 changes: 0 additions & 3 deletions pxr/imaging/hdx/oitRenderTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,9 +147,6 @@ HdxOitRenderTask::Execute(HdTaskContext* ctx)
renderPassState->SetEnableDepthMask(true);
renderPassState->SetColorMasks({HdRenderPassState::ColorMaskRGBA});

// We resolve the AOVs just before rendering any OIT geometry, so
// avoid using the multisampled AOVs.
renderPassState->SetUseAovMultiSample(false);
HdxRenderTask::Execute(ctx);

//
Expand Down
4 changes: 0 additions & 4 deletions pxr/imaging/hdx/oitResolveTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -256,10 +256,6 @@ HdxOitResolveTask::Prepare(HdTaskContext* ctx,
HdxPackageOitResolveImageShader());
_renderPassState->SetRenderPassShader(_renderPassShader);

// We want OIT to resolve into the resolved aov, not the multi sample
// aov. See HdxTaskController::GetRenderingTasks().
_renderPassState->SetUseAovMultiSample(false);

_renderPass->Prepare(GetRenderTags());
}

Expand Down
5 changes: 0 additions & 5 deletions pxr/imaging/hdx/oitVolumeRenderTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,11 +145,6 @@ HdxOitVolumeRenderTask::Execute(HdTaskContext* ctx)
_oitVolumeRenderPassShader->SetCullStyle(
renderPassState->GetCullStyle());

// We want OIT to render into the resolve aov, not the multi sample aov.
// This assumes a 'resolve' task has been run between rendering the opaque
// prims and volume prims. See HdxTaskController::GetRenderingTasks().
renderPassState->SetUseAovMultiSample(false);

//
// Translucent pixels pass
//
Expand Down
5 changes: 5 additions & 0 deletions pxr/imaging/hdx/renderSetupTask.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,8 @@ HdxRenderSetupTask::SyncParams(HdSceneDelegate* delegate,

if (HdStRenderPassState * const hdStRenderPassState =
dynamic_cast<HdStRenderPassState*>(renderPassState.get())) {
hdStRenderPassState->SetUseAovMultiSample(
params.useAovMultiSample);
hdStRenderPassState->SetResolveAovMultiSample(
params.resolveAovMultiSample);

Expand Down Expand Up @@ -313,6 +315,7 @@ std::ostream& operator<<(std::ostream& out, const HdxRenderTaskParams& pv)
<< pv.blendConstantColor << " "
<< pv.blendEnable << " "
<< pv.enableAlphaToCoverage << ""
<< pv.useAovMultiSample << ""
<< pv.resolveAovMultiSample << ""

<< pv.camera << " "
Expand Down Expand Up @@ -368,6 +371,8 @@ bool operator==(const HdxRenderTaskParams& lhs, const HdxRenderTaskParams& rhs)
lhs.blendConstantColor == rhs.blendConstantColor &&
lhs.blendEnable == rhs.blendEnable &&
lhs.enableAlphaToCoverage == rhs.enableAlphaToCoverage &&
lhs.useAovMultiSample == rhs.useAovMultiSample &&
lhs.resolveAovMultiSample == rhs.resolveAovMultiSample &&

lhs.camera == rhs.camera &&
lhs.framing == rhs.framing &&
Expand Down
5 changes: 5 additions & 0 deletions pxr/imaging/hdx/renderSetupTask.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ struct HdxRenderTaskParams
, blendConstantColor(0.0f, 0.0f, 0.0f, 0.0f)
, blendEnable(false)
, enableAlphaToCoverage(true)
, useAovMultiSample(true)
, resolveAovMultiSample(true)
// Camera framing and viewer state
, viewport(0.0)
Expand Down Expand Up @@ -242,6 +243,10 @@ struct HdxRenderTaskParams
// AlphaToCoverage
bool enableAlphaToCoverage;

// If true (default), render into the multi-sampled AOVs (rather than
// the resolved AOVs).
bool useAovMultiSample;

// If true (default), multi-sampled AOVs will be resolved at the end of a
// render pass.
bool resolveAovMultiSample;
Expand Down
18 changes: 16 additions & 2 deletions pxr/imaging/hdx/taskController.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -380,8 +380,14 @@ HdxTaskController::_CreateRenderTask(TfToken const& materialTag)
GetRenderIndex()->InsertTask<HdxRenderTask>(&_delegate, taskId);
} else if (materialTag == HdxMaterialTagTokens->translucent) {
GetRenderIndex()->InsertTask<HdxOitRenderTask>(&_delegate, taskId);
// OIT is using its own buffers which are only per pixel and not per
// sample. Thus, we resolve the AOVs before starting to render any
// OIT geometry and only use the resolved AOVs from then on.
renderParams.useAovMultiSample = false;
} else if (materialTag == HdStMaterialTagTokens->volume) {
GetRenderIndex()->InsertTask<HdxOitVolumeRenderTask>(&_delegate, taskId);
// See above comment about OIT.
renderParams.useAovMultiSample = false;
}

// Create an initial set of render tags in case the user doesn't set any
Expand Down Expand Up @@ -452,10 +458,18 @@ HdxTaskController::_SetBlendStateForMaterialTag(TfToken const& materialTag,
void
HdxTaskController::_CreateOitResolveTask()
{
HdxRenderTaskParams renderParams;
// OIT is using its own buffers which are only per pixel and not per
// sample. Thus, we resolve the AOVs before starting to render any
// OIT geometry and only use the resolved AOVs from then on.
renderParams.useAovMultiSample = false;

_oitResolveTaskId = GetControllerId().AppendChild(_tokens->oitResolveTask);

GetRenderIndex()->InsertTask<HdxOitResolveTask>(&_delegate,
_oitResolveTaskId);

_delegate.SetParameter(_oitResolveTaskId, HdTokens->params, renderParams);
}

void
Expand Down Expand Up @@ -960,7 +974,7 @@ HdxTaskController::SetRenderOutputs(TfTokenVector const& outputs)

// Set AOV bindings on render tasks
for (SdfPath const& renderTaskId : _renderTaskIds) {
bool isFirstRenderTask = renderTaskId == _renderTaskIds.front();
const bool isFirstRenderTask = renderTaskId == _renderTaskIds.front();

const HdRenderPassAovBindingVector& aovBindings =
isFirstRenderTask ?
Expand Down Expand Up @@ -1152,7 +1166,7 @@ HdxTaskController::SetRenderOutputSettings(TfToken const& name,
_delegate.GetParameter<HdxRenderTaskParams>(
renderTaskId, HdTokens->params);

bool isFirstRenderTask = renderTaskId == _renderTaskIds.front();
const bool isFirstRenderTask = renderTaskId == _renderTaskIds.front();

for (size_t i = 0; i < renderParams.aovBindings.size(); ++i) {
if (renderParams.aovBindings[i].renderBufferId == renderBufferId) {
Expand Down

0 comments on commit 83aa020

Please sign in to comment.