Skip to content

Commit 9b71c99

Browse files
Hydrogent: initialize OIT targets
1 parent c9c751f commit 9b71c99

File tree

8 files changed

+99
-22
lines changed

8 files changed

+99
-22
lines changed

Hydrogent/interface/HnFrameRenderTargets.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#pragma once
2828

2929
#include <array>
30+
#include <vector>
3031

3132
#include "../../../DiligentCore/Graphics/GraphicsEngine/interface/TextureView.h"
3233

@@ -60,6 +61,7 @@ struct HnFrameRenderTargets
6061
ITextureView* PrevDepthDSV = nullptr;
6162

6263
std::array<ITextureView*, 2> ClosestSelectedLocationRTV = {};
64+
std::vector<ITextureView*> OITUAVs;
6365

6466
ITextureView* JitteredFinalColorRTV = nullptr;
6567

Hydrogent/interface/HnRenderDelegate.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ class HnRenderDelegate final : public pxr::HdRenderDelegate
187187
/// Whether to pack vertex positions into two 32-bit uints.
188188
bool PackVertexPositions = false;
189189

190+
/// Whether to use order-independent transparency.
191+
///
192+
/// \remarks OIT improves visual quality when rendering transparent objects,
193+
/// but requires additional memory and processing power.
194+
bool UseOIT = false;
195+
190196
/// When shadows are enabled, the size of the PCF kernel.
191197
/// Allowed values are 2, 3, 5, 7.
192198
Uint32 PCFKernelSize = 3;

Hydrogent/interface/HnTokens.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ namespace USD
120120
(closestSelectedLocation0Target) \
121121
(closestSelectedLocation1Target) \
122122
(closestSelectedLocationFinalTarget) \
123+
(oitTarget) \
123124
(frameRenderTargets) \
124125
(depthBuffer) \
125126
(depthBuffer0) \

Hydrogent/interface/Tasks/HnBeginFrameTask.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@ class HnBeginFrameTask final : public HnTask
213213
pxr::SdfPath m_JitteredFinalColorTargetId;
214214

215215
std::array<pxr::SdfPath, HnFrameRenderTargets::GBUFFER_TARGET_COUNT> m_GBufferTargetIds;
216+
std::vector<pxr::SdfPath> m_OITTargetIds;
216217

217218
pxr::SdfPath m_SelectionDepthBufferId;
218219

Hydrogent/src/HnRenderDelegate.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ static std::shared_ptr<USD_Renderer> CreateUSDRenderer(const HnRenderDelegate::C
196196
USDRendererCI.PCFKernelSize = RenderDelegateCI.PCFKernelSize;
197197
USDRendererCI.MaxShadowCastingLightCount = RenderDelegateCI.MaxShadowCastingLightCount;
198198

199-
USDRendererCI.EnableOIT = !DeviceInfo.IsGLDevice();
199+
USDRendererCI.EnableOIT = RenderDelegateCI.UseOIT;
200200

201201
RefCntAutoPtr<IBuffer> pJointsCB;
202202
if (RenderDelegateCI.MaxJointCount > 0)

Hydrogent/src/Tasks/HnBeginFrameTask.cpp

Lines changed: 61 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ HnBeginFrameTask::HnBeginFrameTask(pxr::HdSceneDelegate* ParamsDelegate, const p
7777
UNEXPECTED("ParamsDelegate is null");
7878
return;
7979
}
80-
pxr::HdRenderIndex& RenderIndex = ParamsDelegate->GetRenderIndex();
80+
pxr::HdRenderIndex& RenderIndex = ParamsDelegate->GetRenderIndex();
81+
HnRenderDelegate* pRenderDelegate = static_cast<HnRenderDelegate*>(RenderIndex.GetRenderDelegate());
82+
USD_Renderer& Renderer = *pRenderDelegate->GetUSDRenderer();
8183

8284
// Insert empty Bprims for offscreen render targets into the render index.
8385
// The render targets will be created when Prepare() is called and the
@@ -103,6 +105,16 @@ HnBeginFrameTask::HnBeginFrameTask(pxr::HdSceneDelegate* ParamsDelegate, const p
103105
m_ClosestSelLocnTargetId[0] = InitBrim(HnRenderResourceTokens->closestSelectedLocation0Target);
104106
m_ClosestSelLocnTargetId[1] = InitBrim(HnRenderResourceTokens->closestSelectedLocation1Target);
105107
m_JitteredFinalColorTargetId = InitBrim(HnRenderResourceTokens->jitteredFinalColorTarget);
108+
109+
if (Renderer.GetSettings().EnableOIT)
110+
{
111+
const std::vector<TextureDesc> OITDescs = Renderer.GetOITTextureDescs();
112+
m_OITTargetIds.resize(OITDescs.size());
113+
for (size_t i = 0; i < OITDescs.size(); ++i)
114+
{
115+
m_OITTargetIds[i] = InitBrim(pxr::TfToken{HnRenderResourceTokens->oitTarget.GetString() + std::to_string(i)});
116+
}
117+
}
106118
}
107119

108120
HnBeginFrameTask::~HnBeginFrameTask()
@@ -192,11 +204,17 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
192204
m_FrameBufferWidth = FinalTargetDesc.Width;
193205
m_FrameBufferHeight = FinalTargetDesc.Height;
194206

195-
auto UpdateBrim = [&](const pxr::SdfPath& Id, TEXTURE_FORMAT Format, const std::string& Name) -> ITextureView* {
207+
HnRenderDelegate* pRenderDelegate = static_cast<HnRenderDelegate*>(RenderIndex->GetRenderDelegate());
208+
IRenderDevice* pDevice = pRenderDelegate->GetDevice();
209+
USD_Renderer& Renderer = *pRenderDelegate->GetUSDRenderer();
210+
211+
auto UpdateBrim = [&](const pxr::SdfPath& Id,
212+
TEXTURE_FORMAT Format,
213+
BIND_FLAGS BindFlags,
214+
const std::string& Name) -> ITextureView* {
196215
if (Format == TEX_FORMAT_UNKNOWN)
197216
return nullptr;
198217

199-
IRenderDevice* const pDevice = static_cast<HnRenderDelegate*>(RenderIndex->GetRenderDelegate())->GetDevice();
200218
if (!pDevice->GetTextureFormatInfo(Format).Supported)
201219
{
202220
Format = GetFallbackTextureFormat(Format);
@@ -211,22 +229,20 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
211229
return nullptr;
212230
}
213231

214-
if (auto* pView = Renderbuffer->GetTarget())
232+
if (ITextureView* pView = Renderbuffer->GetTarget())
215233
{
216-
const auto& ViewDesc = pView->GetDesc();
217-
const auto& TargetDesc = pView->GetTexture()->GetDesc();
234+
const TextureViewDesc& ViewDesc = pView->GetDesc();
235+
const TextureDesc& TargetDesc = pView->GetTexture()->GetDesc();
218236
if (TargetDesc.GetWidth() == FinalTargetDesc.GetWidth() &&
219237
TargetDesc.GetHeight() == FinalTargetDesc.GetHeight() &&
220238
ViewDesc.Format == Format)
221239
return pView;
222240
}
223241

224-
const bool IsDepth = GetTextureFormatAttribs(Format).IsDepthStencil();
225-
226-
auto TargetDesc = FinalTargetDesc;
227-
TargetDesc.Name = Name.c_str();
228-
TargetDesc.Format = Format;
229-
TargetDesc.BindFlags = (IsDepth ? BIND_DEPTH_STENCIL : BIND_RENDER_TARGET) | BIND_SHADER_RESOURCE;
242+
TextureDesc TargetDesc = FinalTargetDesc;
243+
TargetDesc.Name = Name.c_str();
244+
TargetDesc.Format = Format;
245+
TargetDesc.BindFlags = BindFlags;
230246

231247
RefCntAutoPtr<ITexture> pTarget;
232248
pDevice->CreateTexture(TargetDesc, nullptr, &pTarget);
@@ -237,7 +253,19 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
237253
}
238254
LOG_INFO_MESSAGE("HnBeginFrameTask: created ", TargetDesc.GetWidth(), "x", TargetDesc.GetHeight(), " ", Name, " texture");
239255

240-
auto* const pView = pTarget->GetDefaultView(IsDepth ? TEXTURE_VIEW_DEPTH_STENCIL : TEXTURE_VIEW_RENDER_TARGET);
256+
TEXTURE_VIEW_TYPE ViewType = TEXTURE_VIEW_UNDEFINED;
257+
if (BindFlags & BIND_DEPTH_STENCIL)
258+
ViewType = TEXTURE_VIEW_DEPTH_STENCIL;
259+
else if (BindFlags & BIND_UNORDERED_ACCESS)
260+
ViewType = TEXTURE_VIEW_UNORDERED_ACCESS;
261+
else if (BindFlags & BIND_RENDER_TARGET)
262+
ViewType = TEXTURE_VIEW_RENDER_TARGET;
263+
else if (BindFlags & BIND_SHADER_RESOURCE)
264+
ViewType = TEXTURE_VIEW_SHADER_RESOURCE;
265+
else
266+
UNEXPECTED("Unexpected bind flags");
267+
268+
ITextureView* const pView = pTarget->GetDefaultView(ViewType);
241269
VERIFY(pView != nullptr, "Failed to get texture view for target ", Name);
242270

243271
Renderbuffer->SetTarget(pView);
@@ -247,10 +275,12 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
247275

248276
m_FrameRenderTargets.FinalColorRTV = pFinalColorRTV;
249277

278+
constexpr BIND_FLAGS BIND_RT_SR = BIND_RENDER_TARGET | BIND_SHADER_RESOURCE;
279+
constexpr BIND_FLAGS BIND_DS_SR = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
250280
for (Uint32 i = 0; i < HnFrameRenderTargets::GBUFFER_TARGET_COUNT; ++i)
251281
{
252282
const char* Name = HnFrameRenderTargets::GetGBufferTargetName(static_cast<HnFrameRenderTargets::GBUFFER_TARGET>(i));
253-
m_FrameRenderTargets.GBufferRTVs[i] = UpdateBrim(m_GBufferTargetIds[i], m_Params.Formats.GBuffer[i], Name);
283+
m_FrameRenderTargets.GBufferRTVs[i] = UpdateBrim(m_GBufferTargetIds[i], m_Params.Formats.GBuffer[i], BIND_RT_SR, Name);
254284
if (m_FrameRenderTargets.GBufferRTVs[i])
255285
{
256286
m_FrameRenderTargets.GBufferSRVs[i] = m_FrameRenderTargets.GBufferRTVs[i]->GetTexture()->GetDefaultView(TEXTURE_VIEW_SHADER_RESOURCE);
@@ -262,12 +292,23 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
262292
}
263293
}
264294

265-
m_FrameRenderTargets.SelectionDepthDSV = UpdateBrim(m_SelectionDepthBufferId, m_Params.Formats.Depth, "Selection depth buffer");
266-
m_FrameRenderTargets.DepthDSV = UpdateBrim(m_DepthBufferId[0], m_Params.Formats.Depth, "Depth buffer 0");
267-
m_FrameRenderTargets.PrevDepthDSV = UpdateBrim(m_DepthBufferId[1], m_Params.Formats.Depth, "Depth buffer 1");
268-
m_FrameRenderTargets.ClosestSelectedLocationRTV[0] = UpdateBrim(m_ClosestSelLocnTargetId[0], m_Params.Formats.ClosestSelectedLocation, "Closest selected location 0");
269-
m_FrameRenderTargets.ClosestSelectedLocationRTV[1] = UpdateBrim(m_ClosestSelLocnTargetId[1], m_Params.Formats.ClosestSelectedLocation, "Closest selected location 1");
270-
m_FrameRenderTargets.JitteredFinalColorRTV = UpdateBrim(m_JitteredFinalColorTargetId, m_Params.Formats.JitteredColor, "Jittered final color");
295+
m_FrameRenderTargets.SelectionDepthDSV = UpdateBrim(m_SelectionDepthBufferId, m_Params.Formats.Depth, BIND_DS_SR, "Selection depth buffer");
296+
m_FrameRenderTargets.DepthDSV = UpdateBrim(m_DepthBufferId[0], m_Params.Formats.Depth, BIND_DS_SR, "Depth buffer 0");
297+
m_FrameRenderTargets.PrevDepthDSV = UpdateBrim(m_DepthBufferId[1], m_Params.Formats.Depth, BIND_DS_SR, "Depth buffer 1");
298+
m_FrameRenderTargets.ClosestSelectedLocationRTV[0] = UpdateBrim(m_ClosestSelLocnTargetId[0], m_Params.Formats.ClosestSelectedLocation, BIND_RT_SR, "Closest selected location 0");
299+
m_FrameRenderTargets.ClosestSelectedLocationRTV[1] = UpdateBrim(m_ClosestSelLocnTargetId[1], m_Params.Formats.ClosestSelectedLocation, BIND_RT_SR, "Closest selected location 1");
300+
m_FrameRenderTargets.JitteredFinalColorRTV = UpdateBrim(m_JitteredFinalColorTargetId, m_Params.Formats.JitteredColor, BIND_RT_SR, "Jittered final color");
301+
302+
if (Renderer.GetSettings().EnableOIT)
303+
{
304+
const std::vector<TextureDesc> OITDescs = Renderer.GetOITTextureDescs();
305+
m_FrameRenderTargets.OITUAVs.resize(OITDescs.size());
306+
for (size_t i = 0; i < OITDescs.size(); ++i)
307+
{
308+
const TextureDesc& Desc = OITDescs[i];
309+
m_FrameRenderTargets.OITUAVs[i] = UpdateBrim(m_OITTargetIds[i], Desc.Format, Desc.BindFlags, Desc.Name);
310+
}
311+
}
271312

272313
(*TaskCtx)[HnRenderResourceTokens->frameRenderTargets] = pxr::VtValue{&m_FrameRenderTargets};
273314

PBR/interface/PBR_Renderer.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -774,6 +774,9 @@ class PBR_Renderer
774774
/// one over the maximum vertex position minus the minimum vertex position.
775775
static inline void PackVertexPos64(const float3& Pos, const float3& Bias, const float3& Scale, Uint32& U0, Uint32& U1);
776776

777+
/// Returns the OIT texture descriptions.
778+
std::vector<TextureDesc> GetOITTextureDescs() const;
779+
777780
protected:
778781
ShaderMacroHelper DefineMacros(const PSOKey& Key) const;
779782

PBR/src/PBR_Renderer.cpp

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ PBR_Renderer::PBR_Renderer(IRenderDevice* pDevice,
356356

357357
if (m_Settings.EnableOIT)
358358
{
359-
if (m_Device.GetDeviceInfo().Features.ComputeShaders)
359+
if (!m_Device.GetDeviceInfo().Features.ComputeShaders)
360360
{
361361
LOG_WARNING_MESSAGE("OIT requires compute shaders, but they are not supported by the device. OIT will be disabled.");
362362
m_Settings.EnableOIT = false;
@@ -2196,4 +2196,27 @@ void* PBR_Renderer::WriteSkinningData(void* pDst, const WriteSkinningDataAttribs
21962196
return WriteSkinningData(pDst, Attribs, PackMatrixRowMajor, m_Settings.MaxJointCount);
21972197
}
21982198

2199+
std::vector<TextureDesc> PBR_Renderer::GetOITTextureDescs() const
2200+
{
2201+
std::vector<TextureDesc> OITTextures;
2202+
if (m_Settings.EnableOIT)
2203+
{
2204+
TextureDesc Desc;
2205+
Desc.Type = RESOURCE_DIM_TEX_2D;
2206+
Desc.MipLevels = 1;
2207+
Desc.BindFlags = BIND_UNORDERED_ACCESS | BIND_SHADER_RESOURCE;
2208+
2209+
OITTextures.reserve(2);
2210+
2211+
Desc.Name = "OIT transparency";
2212+
Desc.Format = TEX_FORMAT_RGBA8_UNORM;
2213+
OITTextures.emplace_back(Desc);
2214+
2215+
Desc.Name = "OIT depth";
2216+
Desc.Format = TEX_FORMAT_RGBA32_FLOAT;
2217+
OITTextures.emplace_back(Desc);
2218+
}
2219+
return OITTextures;
2220+
}
2221+
21992222
} // namespace Diligent

0 commit comments

Comments
 (0)