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

前言

本项目是为开发一套较为完整且表现不错的真实场景渲染系统引擎,预计能够良好地实现光照效果以及渲染后噪声的处理。

各工作情况

1、辐射预计算

该部分需要在 Falcor 框架下实现渲染当中的辐射预计算技术,从而实现环境全局光照实时计算,具体进度请前往这位作者查看。

2、渲染框架

该部分需要实现对 Falcor 基础框架的修改以及基础功能增添,来配合其它工作的实现完成,具体进度请前往这位作者查看。

3、后降噪处理

3.1 阶段任务

在拟写好 NRDPass 的基础框架后,可以开始编写其具体的函数(同时可能会添加新的私有或公有变量)。该部分由两位组员负责,另一位组员具体工作进度请前往这位作者查看。笔者工作如下:

3.2 个人工作

先复习一下之前拟写的公有函数大纲:

		static SharedPtr create();
        virtual Dictionary getScriptingDictionary() override;
        virtual RenderPassReflection reflect() override;
        virtual void compile() override;
        virtual void execute() override;
        virtual void renderUI() override;
        virtual void setScene() override;

3.2.1 Create() 函数

根据父类 RenderPasses 的批注提示:

Render passes are expected to implement a static create() function that returns
        a shared pointer to a new object, or throws an exception if creation failed.

这个 Create() 函数需要编写为用于新创建并返回一个 NRDPass 类的指针,从而让 Falcor 框架的渲染通道通过指针控制一个新的 NRD 通道。

因此,同时参考其它通道的定义,这个函数需要传入渲染环境参数即其函数为:

NRDPass::SharedPtr NRDPass::create(RenderContext* pRenderContext, const Dictionary& dict)

而函数内部仅需要创建并返回,所以简写:

{
    return SharedPtr(new NRDPass(dict));
}

3.2.2 getScriptingDictionary() 函数

根据父类 RenderPasses 的提示,该函数需要创建属于 NRD 核心数据的字典类 Dictionary 的对象:

/** Get a dictionary that can be used to reconstruct the object  */

首先,查看 Dictionary 类,可以发现它重载了符号 “ [ ] ”,使其能够存储给入的一个字符串类型数据,含义为名字;它返回的是已经记录了名字且绑定上了 C++ 的字典类型的变量 mMap 的 Value 类对象:

Value operator[](const std::string& name) { return Value(mMap, name); }

另一方面,Value 类重载了符号 “ = ”,可以对应名字赋值 mMap 的元素:

void operator=(const T& t) { mContainer[mName.c_str()] = t; }

因此,这里可以形成一个简单的 key - value 绑定语句:字典 [ 名字 ] = 值。根据这个语句,则可以编写这个函数了,例如(这里先展示一下已写好的代码):

	dict[kEnabled] = mEnabled;
    dict[kMethod] = mDenoisingMethod;

这里就代表将 NRD 的启动状态 mEnabled 以及降噪方法 mDenoisingMethod 存入字典 dict。

那么接下来根据 NRD 的需求,为 NRDPass 类添加私有变量,例如:

		// --------- NRD ---------
        // NRD Denoiser & Method
        nrd::Denoiser* mpDenoiser = nullptr;
        DenoisingMethod mDenoisingMethod = DenoisingMethod::RelaxDiffuseSpecular;

        // NRD Settings
        nrd::CommonSettings mCommonSettings = {};
        nrd::RelaxDiffuseSettings mRelaxDiffuseSettings = {};
        nrd::RelaxDiffuseSpecularSettings mRelaxDiffuseSpecularSettings = {};
        nrd::ReblurSettings mReblurSettings = {};

        bool mEnabled = true;
        bool mRecreateDenoiser = false;
        bool mWorldSpaceMotion = true;
        float mMaxIntensity = 1000.f;
        float mDisocclusionThreshold = 2.f;

以上列举的是一些 NRD 的降噪器、设置等必要变量(核心数据),接着按照公式 字典 [ 名字 ] = 值 进行存储到字典即可。

另外,可以注意到的是,由于 NRD 提供了多个降噪器方法但可以只选择其一使用,所以可以用上 if 语句控制不同降噪器存储不同的值,这样既可以节省时间也可以节省存储空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值