码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 简要归纳UE5 Lumen全局光照原理


    文章目录

    • 一、Jim kajiya老爷子的渲染方程:
    • 二、工程上的实时全局光照技术:
    • 三、Lumen的解决办法:
      • 1.用距离场 Distance Field(SDF)判断光线和三角面相交:
      • 2.表面缓存(Surface Cache)
    • 四、Lumen工程上的具体实现,会根据物体的距离采用不同的加速方案:

    一、Jim kajiya老爷子的渲染方程:

    请添加图片描述
    求全局光照就是求解渲染方程,我们将两边都有未知数的渲染方程变换成离散形式:
    请添加图片描述
    更形象的描述这个离散的渲染方程:
    请添加图片描述
    要给每个三角形着色就得先判断光线有没有和它相交,以下是求光线和三角形相交的次数的计算,5次反弹已经是天文数字,无限次反弹目前的GPU根本做不到实时:
    请添加图片描述

    二、工程上的实时全局光照技术:

    在这里插入图片描述
    他们实现各异,但本质都是逼近渲染方程:L=E+KE+K²E 但实际上的实现间接光都只有一次反弹
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    Lumen创新性的采用直接光和间接光分开求取:用距离场求得直接光,表面缓存求间接光。
    在这里插入图片描述

    三、Lumen的解决办法:

    1.用距离场 Distance Field(SDF)判断光线和三角面相交:

    在这里插入图片描述
    距离场Distance Field用一个个点阵确定离它最近三角面的距离。

    怎么用距离场判断光线是否和三角面相交呢?
    在这里插入图片描述
    离光源最近的点是3,往前步进3一定不会和任何三角面相交。
    在这里插入图片描述
    在这里插入图片描述
    再从3判断离自己最近的三角面是1,继续往前步进1,也不会有任何三角面相交。
    在这里插入图片描述
    一直步进到新的点离三角形的距离小于0.01,那么说明光线和这个三角面相交了。
    在这里插入图片描述
    如果这个距离阈值越来越大,那么就可以判断这条光线没有和任何三角形相交,可以不用计算着色了。

    距离场是提前算好的离线数据,所以三角面求交变得很快,当然如果物体移动了也要重新计算距离场:
    在这里插入图片描述
    但即使重新计算距离场也比传统的和所有三角面判断求交更快。

    2.表面缓存(Surface Cache)

    距离场(SDF)有个致命的问题就是只能判断相交,无法获取材质信息,所以无法给三角面着色。那么UE5就引入了表面缓存(Surface Cache):
    在这里插入图片描述
    不包含材质信息,无法计算BRDF(求光线怎么反弹)。

    这里我们需要引入一个概念辐射度算法:
    在这里插入图片描述
    将场景离散成面元组成,那么一个面元向外辐射的能量等于其他面元辐射给它的能量之和。
    在这里插入图片描述

    在这里插入图片描述
    面元细分的越多,间接光的反弹次数就越多,成像也就越逼真。

    接下来就是怎么计算B1面元的对外辐射呢?B2 B3 B4都是未知数,那就得用Lumen中最重要的实时光照基础:复用reuse

    复用reuse:即用上一帧接收的光照做为本帧的向外辐射的能量(光照)。这样就可以求得B1
    在这里插入图片描述
    所谓的表面缓存(Surface Cache)就是两帧画面的光照中转站:
    在这里插入图片描述
    在这里插入图片描述
    Lumen巧妙的利用了第0帧面元的直接光是已知的特性,对面元单独求解,规避了传统辐射度算法需要联立方程组求解未知数的难度:
    在这里插入图片描述
    这样就可以近似实现无限次反弹的计算。

    四、Lumen工程上的具体实现,会根据物体的距离采用不同的加速方案:

    在这里插入图片描述
    Lumen的厉害之处在于,它融合了经典的全局光照思路(光线追踪+辐射度算法),以及一系列巧妙的工程手段,解开了原本无法直接求解的渲染方程。

  • 相关阅读:
    [PHP]str_split性能问题
    一行log日志,结果引发了P1的线上事故!
    计算机毕业设计Java汉服服装租赁系统(源码+系统+mysql数据库+lw文档)
    设计模式 建造者模式介绍、案例应用、建造者模式和工厂模式的区别
    渗透测试CTF-图片隐写的详细教程(干货)
    Redis应用问题解决
    光电二极管放大应用方案
    4---Linux:gcc,g++编译/制作并调用静态库,动态库/makefile
    刷题经验分享(一)
    基于微信小程序的药店管理系统设计与实现-计算机毕业设计源码+LW文档
  • 原文地址:https://blog.csdn.net/cxihu/article/details/133764148
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号