< 山东大学软件学院项目实训 > 渲染引擎系统(一)(组工作合集 & 个人工作)
发布时间
阅读量:
阅读量
目录
-
前言
-
本阶段任务
-
1、辐射预计算
-
2、后降噪处理
-
- 2.1 NRD
- 2.2 实现方法研究
-
下阶段任务
前言
本项目是为开发一套较为完整且表现不错的真实场景渲染系统引擎,预计能够良好地实现光照效果以及渲染后噪声的处理。
研发平台:Visual Studio 2019
软件框架:Falcor 3.4 框架
操作系统:Windows 10 version 20H2 (October 2020 Update) or newer, OS build revision .789 or newer
SDK版本:[Windows 10 SDK (10.0.19041.0) for Windows 10, version 2004]
驱动版本:NVIDIA driver 466.11 or newer
本阶段任务
本月主要任务为技术准备,从而为后续研究提供技术支持:
1、辐射预计算的研究;
2、市场现有的后降噪处理 SDK 的技术探究。
1、辐射预计算
2、后降噪处理
经过市场降噪处理的技术的了解后,后降噪处理部分计划集成表现较好的 NRD 技术工具。该技术是一项较为新的技术,所以相关的技术文档十分稀少;本月,小组成员探究了 NRD SDK 并对用法进行了学习。
2.1 NRD
NRD,全名Nvidia Real-time Denoiser(英伟达实时降噪器),是英伟达官方正在研发的一个时空双域去噪库,旨在处理低的RPP(ray per pixel)信号。它使用输入信号和环境条件来提供与地面真实图像相当的结果;能够处理包括漫反射、高光、光源等出现的噪声。
该技术的图形 API 环境是:DirectX11、DirectX12 以及 Vulkun。其集成方法有三种,其中一种可以是利用 Nvidia 的 NRI(NVIDIA Rendering Interface)包装上述三个 API,进行集成。
2.2 实现方法研究
小组两位成员经过共同研究(另一位组员可以请前往这位作者查看),得到该方法实现降噪的大致步骤:
1、获取本地设备信息,传入 NRI;
2、初始化 NRD,设置其降噪方法;
3、利用 NRI,设置输入输出池;
4、调用 NRD.Denoise(),开始降噪。
并得到了该方法的伪代码,如下:
//===================================================================================================================
// STEP 1 - DECLARATIONS
//===================================================================================================================
#include "NRIDescs.hpp"
#include "Extensions/NRIWrapperD3D12.h"
#include "Extensions/NRIHelper.h"
#include "NRD.h"
NrdIntegration NRD = NrdIntegration(maxNumberOfFramesInFlight);
struct NriInterface
: public nri::CoreInterface
, public nri::HelperInterface
, public nri::WrapperD3D12Interface{};
NriInterface NRI;nri::Device* nriDevice = nullptr;
//===================================================================================================================
// STEP 2 - WRAP NATIVE DEVICE
//===================================================================================================================
nri::DeviceCreationD3D12Desc deviceDesc = {};
deviceDesc.d3d12Device = ...;
deviceDesc.d3d12PhysicalAdapter = ...;
deviceDesc.d3d12GraphicsQueue = ...;
deviceDesc.enableNRIValidation = false;
// Wrap the device
nri::Result result = nri::CreateDeviceFromD3D12Device(deviceDesc, nriDevice);
// Get needed functionality
result = nri::GetInterface(*nriDevice, NRI_INTERFACE(nri::CoreInterface), (nri::CoreInterface*)&NRI);
result = nri::GetInterface(*nriDevice, NRI_INTERFACE(nri::HelperInterface), (nri::HelperInterface*)&NRI);
// Get needed "wrapper" extension, XXX - can be D3D11, D3D12 or VULKAN
result = nri::GetInterface(*nriDevice, NRI_INTERFACE(nri::WrapperXXXInterface), (nri::WrapperXXXInterface*)&NRI);
//===================================================================================================================
// STEP 3 - INITIALIZE NRD
//===================================================================================================================
const nrd::MethodDesc methodDescs[] =
{
// put neeeded methods here, like:
{ nrd::Method::REBLUR_DIFFUSE_SPECULAR, renderResolution.x, renderResolution.y },};
nrd::DenoiserCreationDesc denoiserCreationDesc = {};
denoiserCreationDesc.requestedMethods = methodDescs;
denoiserCreationDesc.requestedMethodNum = methodNum;
bool result = NRD.Initialize(*nriDevice, NRI, NRI, denoiserCreationDesc);
//===================================================================================================================
// STEP 4 - WRAP NATIVE POINTERS
//===================================================================================================================
// Wrap the command buffer
nri::CommandBufferD3D12Desc cmdDesc = {};
cmdDesc.d3d12CommandList = (ID3D12GraphicsCommandList*)&d3d12CommandList;
cmdDesc.d3d12CommandAllocator = nullptr;
// Not needed for NRD Integration layer
nri::CommandBuffer* cmdBuffer = nullptr;
NRI.CreateCommandBufferD3D12(*nriDevice, cmdDesc, cmdBuffer);
// Wrap required textures
nri::TextureTransitionBarrierDesc entryDescs[N] = {};
nri::Format entryFormat[N] = {};
for (uint32_t i = 0; i < N; i++){
nri::TextureTransitionBarrierDesc& entryDesc = entryDescs[i];
const MyResource& myResource = GetMyResource(i);
nri::TextureD3D12Desc textureDesc = {};
textureDesc.d3d12Resource = myResource->GetNativePointer();
NRI.CreateTextureD3D12(*nriDevice, textureDesc, (nri::Texture*&)entryDesc.texture );
entryDesc.nextAccess = ConvertResourceStateToAccessBits( myResource->GetCurrentState() );
entryDesc.nextLayout = ConvertResourceStateToLayout( myResource->GetCurrentState() );
}
//===================================================================================================================
// STEP 5 - DENOISE
//===================================================================================================================
// Populate common settings
// - for the first time use defaults
// - currently NRD supports only the following view space: X - right, Y - top, Z - forward or backward
nrd::CommonSettings commonSettings = {};
PopulateCommonSettings(commonSettings);
// Set settings for each denoiser
nrd::NrdXxxSettings settings = {};
PopulateDenoiserSettings(settings);
NRD.SetMethodSettings(nrd::Method::NRD_XXX, &settings);
// Fill up the user pool
NrdUserPool userPool ={{
// Fill the required inputs and outputs in appropriate slots using entryDescs & entryFormat,
// applying remapping if necessary. Unused slots can be {nullptr, nri::Format::UNKNOWN}
}};
NRD.Denoise(*cmdBuffer, commonSettings, userPool);
//===================================================================================================================
// STEP 6 - CLEANUP
//===================================================================================================================
for (uint32_t i = 0; i < N; i++)
NRI.DestroyTexture(entryDescs[i].texture);
NRI.DestroyCommandBuffer(*cmdBuffer);
//===================================================================================================================
// STEP 7 - DESTROY
//===================================================================================================================
NRD.Destroy();
下阶段任务
根据技术探究成果,尝试分别实现辐射预计算框架、渲染框架以及后降噪处理框架。
全部评论 (0)
还没有任何评论哟~
