Advertisement

< 山东大学软件学院项目实训 > 渲染引擎系统(一)(组工作合集 & 个人工作)

阅读量:

目录

  • 前言

  • 本阶段任务

  • 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)

还没有任何评论哟~