使用 DDGI 创建逼真的光影

每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。

DDGI 是实现逼真的照明效果的绝佳功能。了解如何为移动应用配备 DDGI。

为什么我们需要 DDGI
在使 3D 游戏身临其境的所有因素中,全局照明效果(包括反射、折射和阴影)无疑是皇冠上的明珠。简而言之,糟糕的照明会破坏原本出色的游戏体验。

一种用于创建真实照明的技术被称为动态漫反射全局照明(简称 DDGI)。该技术为游戏提供实时渲染,以精致和吸引人的视觉效果装饰游戏场景。换句话说,DDGI通过动态改变光照,呈现出场景中的每一种颜色,实现物体与场景温度之间的明显关系,丰富场景中信息的表示层次。

6.设置DDGI探针的位置和数量等参数。

// Set the DDGI algorithm parameters.
void
DDGIExample::SetupDDGIParameters()

{
m_ddgiSettings.origin = VecInterface(3.5f, 1.5f, 4.25f, 0.f);
m_ddgiSettings.probeStep = VecInterface(1.3f, 0.55f, 1.5f, 0.f);

}
void DDGIExample::PrepareDDGI()
{

SetupDDGIParameters();

// Pass the settings to the DDGI plugin.
m_ddgiRender->UpdateDDGIProbes(m_ddgiSettings);

}
7.调用DDGI插件的Prepare()函数解析接收到的数据。

void DDGIExample::PrepareDDGI()
{

m_ddgiRender->Prepare();
}
8.调用DDGI插件的Render()函数,缓存漫反射全局光照更新到第4步创建的贴图。

笔记:

在这个版本中,渲染结果是两种纹理:一种用于存储辐照度结果,另一种用于存储法线和深度。然后,可以使用双边滤波算法和存储法线和深度的纹理对存储辐照度结果的纹理进行上采样,通过一定的计算得到最终的漫反射全局光照结果。
如果未调用Render()函数,则渲染结果为更改发生之前的场景。
#define RENDER_EVERY_NUM_FRAME 2
void DDGIExample::Draw()
{

// Call DDGIRender() once every two frames.
if (m_ddgiON && m_frameCnt % RENDER_EVERY_NUM_FRAME == 0) {
m_ddgiRender->UpdateDirectionalLight(m_ddgiDirLight); // Update the light source information.
m_ddgiRender->UpdateCamera(m_ddgiCamera); // Update the camera information.
m_ddgiRender->DDGIRender(); // Use the DDGI plugin to perform rendering once and save the rendering results to the textures created in step 4.
}

}

void DDGIExample::Render()
{
if (!prepared) {
return;
}
SetupDDGICamera();
if (!paused || m_camera.updated) {
UpdateUniformBuffers();
}
Draw();
m_frameCnt++;
}
9. 应用DDGI插件的全局光照(也叫间接光照)效果如下。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年10月9日
下一篇 2022年10月9日

相关推荐