目录
项目介绍
NRD
全名Nvidia Real-time Denoiser ,是英伟达正在研发的一个时空双域降噪库,旨在处理低的RPP(ray per pixel)信号。
该技术的图形 API 环境是:DirectX11、DirectX12 以及 Vulkun。其集成方法有三种,其中一种可以是利用 Nvidia 的 NRI(NVIDIA Rendering Interface)包装上述三个 API,进行集成。
项目目标
在Falcor框架下集成nrd。
当前阶段工作
编写构造函数NRDPass()
NRDPass::NRDPass(const Dictionary& dict)
传入参数Dictionary
设置成员变量
Program::DefineList definesRelax;
definesRelax.add("NRD_USE_OCT_NORMAL_ENCODING", "1");
definesRelax.add("NRD_USE_MATERIAL_ID", "0");
definesRelax.add("NRD_METHOD", "0");
mpPackRadiancePassRelax = ComputePass::create(kShaderPackRadiance, "main", definesRelax);
Program::DefineList definesReblur;
definesReblur.add("NRD_USE_OCT_NORMAL_ENCODING", "1");
definesReblur.add("NRD_USE_MATERIAL_ID", "0");
definesReblur.add("NRD_METHOD", "1");
mpPackRadiancePassReblur = ComputePass::create(kShaderPackRadiance, "main", definesReblur);
对NRD SDK部分变量重写初值
mRelaxDiffuseSpecularSettings.diffusePrepassBlurRadius = 16.0f;
mRelaxDiffuseSpecularSettings.specularPrepassBlurRadius = 16.0f;
mRelaxDiffuseSpecularSettings.diffuseMaxFastAccumulatedFrameNum = 2;
mRelaxDiffuseSpecularSettings.specularMaxFastAccumulatedFrameNum = 2;
mRelaxDiffuseSpecularSettings.diffuseLobeAngleFraction = 0.8f;
mRelaxDiffuseSpecularSettings.disocclusionFixMaxRadius = 32.0f;
mRelaxDiffuseSpecularSettings.enableSpecularVirtualHistoryClamping = false;
mRelaxDiffuseSpecularSettings.disocclusionFixNumFramesToFix = 4;
mRelaxDiffuseSpecularSettings.spatialVarianceEstimationHistoryThreshold = 4;
mRelaxDiffuseSpecularSettings.atrousIterationNum = 6;
mRelaxDiffuseSpecularSettings.depthThreshold = 0.02f;
mRelaxDiffuseSpecularSettings.roughnessFraction = 0.5f;
mRelaxDiffuseSpecularSettings.specularLobeAngleFraction = 0.9f;
mRelaxDiffuseSpecularSettings.specularLobeAngleSlack = 10.0f;
mRelaxDiffuseSettings.prepassBlurRadius = 16.0f;
mRelaxDiffuseSettings.diffuseMaxFastAccumulatedFrameNum = 2;
mRelaxDiffuseSettings.diffuseLobeAngleFraction = 0.8f;
mRelaxDiffuseSettings.disocclusionFixMaxRadius = 32.0f;
mRelaxDiffuseSettings.disocclusionFixNumFramesToFix = 4;
mRelaxDiffuseSettings.spatialVarianceEstimationHistoryThreshold = 4;
mRelaxDiffuseSettings.atrousIterationNum = 6;
mRelaxDiffuseSettings.depthThreshold = 0.02f;
将dict中的value赋给对应key值的设置
for (const auto& [key, value] : dict)
{
if (key == kEnabled) mEnabled = value;
else if (key == kMethod) mDenoisingMethod = value;
// Common settings.
else if (key == kWorldSpaceMotion) mWorldSpaceMotion = value;
else if (key == kDisocclusionThreshold) mDisocclusionThreshold = value;
// Pack radiance settings.
else if (key == kMaxIntensity) mMaxIntensity = value;
// ReLAX diffuse/specular settings.
else if (mDenoisingMethod == DenoisingMethod::RelaxDiffuseSpecular || mDenoisingMethod == DenoisingMethod::ReblurDiffuseSpecular)
{
篇幅过长,不展示
}
else if (mDenoisingMethod == DenoisingMethod::RelaxDiffuse)
{
篇幅过长,不展示
}
else
{
logWarning("Unknown field '{}' in NRD dictionary.", key);
}