设为首页 加入收藏

TOP

手把手教你:轻松打造沉浸感十足的动态漫反射全局光照(一)
2023-07-23 13:29:26 】 浏览:58
Tags:松打造 全局光

一个沉浸感十足的游戏,其场景中的全局光照效果一定功不可没。

动态漫反射全局光照(DDGI)带来的光影变化,是细腻延展的视觉语言,让场景中每种颜色都有了“五彩斑斓”的诠释,场景布局光影,物体关系立显,环境温度降临,拓展了画面信息传达的层次,点睛之笔。

直接光渲染 VS 动态漫反射全局光照

细腻的光照视觉语言带来的技术挑战不小。不同材质表面与光照产生的呈现效果千差万别,漫反射(Diffuse)将光照信息均匀散射,光线的强弱、光照动势、物体表面材质的变换等,面对这些浮动的变量,平台性能和算力备受考验。

针对全局光照需克服的复杂“症状”,HMS Core图形引擎服务提供了一套实时动态漫反射全局光照(DDGI)技术,面向移动端,可扩展到全平台,无需预烘培。基于光照探针(Light Probe)管线,在Probe更新和着色时提出改进算法,降低原有管线的计算负载。实现多次反射信息的全局光照,提升了渲染真实感,满足移动终端设备实时性、互动性要求。

并且,实现一个沉浸感满满的动态漫反射全局光照,几步就能轻松搞定!

Demo示例

开发指南

步骤说明

1.初始化阶段:设置Vulkan运行环境,初始化DDGIAPI类。

2.准备阶段:

创建用于保存DDGI渲染结果的两张Texture,并将Texture的信息传递给DDGI。

准备DDGI插件需要的Mesh、Material、Light、Camera、分辨率等信息,并将其传递给DDGI。

设置DDGI参数。

3.渲染阶段

如果场景的Mesh变换矩阵、Light、Camera信息有变化,则同步更新到DDGI侧。

调用Render()函数,DDGI的渲染结果保存在准备阶段创建的Texture中。

将DDGI的结果融入到着色计算中。

美术限制

1.对于想要使能DDGI效果的场景,DDGI的origin参数应该设置为场景的中心,并设置相应步长和Probe数量使得DDGI Volume能覆盖整个场景。

2.为了让DDGI获得合适的遮挡效果,请避免用没有厚度的墙;如果墙的厚度相对于Probe的密度显得太薄了,会出现漏光(light leaking)现象。同时,构成墙的平面最好是单面(single-sided)的,也即墙是由两个单面平面组成。

3.由于是移动端的DDGI方案,因此从性能和功耗角度出发,有以下建议:①控制传到SDK侧的几何数量(建议5万顶点以内),比如只将场景中的会产生间接光的主体结构传到SDK;②尽量使用合适的Probe密度和数量,尽量不要超过101010。以上建议以最终的呈现结果为主。

开发步骤

1、下载插件的SDK包,解压后获取DDGI SDK相关文件,其中包括1个头文件和2个so文件。Android平台使用的so库文件下载地址请参见:动态漫反射全局光照插件

2、该插件支持Android平台,使用CMake进行构建。以下是CMakeLists.txt部分片段仅供参考:

cmake_minimum_required(VERSION 3.4.1 FATAL_ERROR)
set(NAME DDGIExample)
project(${NAME})

set(PROJ_ROOT ${CMAKE_CURRENT_SOURCE_DIR})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -O2 -DNDEBUG -DVK_USE_PLATFORM_ANDROID_KHR")
file(GLOB EXAMPLE_SRC "${PROJ_ROOT}/src/*.cpp") # 引入开发者主程序代码。
include_directories(${PROJ_ROOT}/include) # 引入头文件,可以将DDGIAPI.h头文件放在此目录。

# 导入librtcore.so和libddgi.so
ADD_LIBRARY(rtcore SHARED IMPORTED)
SET_TARGET_PROPERTIES(rtcore
                PROPERTIES IMPORTED_LOCATION
                ${CMAKE_SOURCE_DIR}/src/main/libs/librtcore.so)

ADD_LIBRARY(ddgi SHARED IMPORTED)
SET_TARGET_PROPERTIES(ddgi
                PROPERTIES IMPORTED_LOCATION
                ${CMAKE_SOURCE_DIR}/src/main/libs/libddgi.so)

add_library(native-lib SHARED ${EXAMPLE_SRC})
target_link_libraries(
    native-lib
    ...
    ddgi # 链接ddgi库。
    rtcore
    android
    log
    z
    ...
)

3、设置Vulkan环境,初始化DDGIAPI类。

// 设置DDGI SDK需要的Vulkan环境信息。
// 包括logicalDevice, queue, queueFamilyIndex信息。
void DDGIExample::SetupDDGIDeviceInfo()
{
    m_ddgiDeviceInfo.physicalDevice = physicalDevice;
    m_ddgiDeviceInfo.logicalDevice = device;
    m_ddgiDeviceInfo.queue = queue;
    m_ddgiDeviceInfo.queueFamilyIndex = vulkanDevice->queueFamilyIndices.graphics;    
}

void DDGIExample::PrepareDDGI()
{
    // 设置Vulkan环境信息。
    SetupDDGIDeviceInfo();
    // 调用DDGI的初始化函数。
    m_ddgiRender->InitDDGI(m_ddgiDeviceInfo);
    ...
}

void DDGIExample::Prepare()
{
    ...
    // 创建DDGIAPI对象。
    std::unique_ptr<DDGIAPI> m_ddgiRender = make_unique<DDGIAPI>();
    ...
    PrepareDDGI();
    ...
}

4、创建两张Texture,用于保存相机视角的漫反射全局光照和法线深度图。为提高渲染性能,Texture支持降分辨率的设置。分辨率越小,渲染性能表现越好,但渲染结果的走样,例如边缘的锯齿等问题可能会更加严重。

// 创建用于保存渲染结果的Texture。
void DDGIExample::CreateDDGITexture()
{
    VkImageUsageFlags usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
    int ddgiTexWidth = width / m_shadingPara.ddgiDownSizeScale; // 纹理宽度。
    int ddgiTexHeight = height / m_shadingPara.ddgiDownSi
首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【FAQ】接入HMS Core广告服务中的.. 下一篇京东金融客户端用户触达方式的探..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目