DDGI介绍
前言DDGI(Dynamic Diffuse Global Illumination,动态漫反射全局光照).是由Nvida于2019年推出的一种基于Probe,基于RayTracing(光线追踪)的动态漫反射全局光照技术,可以在动态的场景与光照中实时的生成漫反射的全局光照.
全局光照在实时渲染领域中,实现全局光照意味着实现间接光照,即光线弹射两次或更多次后进入人眼的光照。
在DDGI技术出现的2019年之前,学界在解决全局光照问题时的方法就已经可谓是百花齐放,所以我们先简单回顾一些经典的全局光照的解决方案.
Baked Global IlluminationBaked Global Illumination(烘焙全局光照)或称Lightmap(光照贴图)是一种离线计算全局光照的方法,也是目前游戏中主流的解决方法.
这种方法的基本思路是将场景中的光照信息预先计算并保存为一张光照贴图,然后在渲染时直接读取光照贴图进行渲染.而在计算光照信息时,常常会用到光子映射的技术.
它们的优点是结果细腻,但是缺点是无法处理动态场景或动态光源.
这不由得让我想起了小时玩黑魂3时判断宝箱怪的技巧:没有影子的 ...
PBR--从理论到实际
状态: 更新中…
Intro
前置知识辐射度量学下面的所有概念,请记英文(因为中文翻译千奇百怪).
Radiant Energy(辐射能量)单位: J(焦耳)
用于描述能量的大小.比如一颗原子弹能释放的总能量大约为10^10 J.
Radiant Flux(辐射通量)单位: W(瓦特)单位: lm(流明,照明度单位,lumen)单位: J/s(焦耳每秒)
描述单位时间内通过某一面积的辐射能量.比如太阳mitted的辐射通量大约为3.828 x 10^26 W/m^2.
Radiant Intensity(辐射强度)
功率/立体角
单位: W/sr (瓦每立体角)
单位: cd(坎德拉,candela)
太阳照的坎德拉为3.828 x 10^10 cd/m^2.地球在太阳的立体角为: 23.45 deg.可求太阳对输出的功率为: 3.828 x 10^10 W/m^2 * 23.45 deg = 1.05 x 10^11 W/sr.
再比如这个灯泡:
Irradiance
功率/面积
单位 ...
NeRF介绍
NeRF介绍
前言NeRF(Nerual Radiance Field):神经辐射场,是在2020年被提出的一种三维重建技术。由于其对比传统三维重建技术来说有简单快速且效果好的优势,尤其是解决了传统三维重建难以处理的反射表面和烟雾等半透明物体,以至于迅速爆火甚至“出圈”。
三维重建我们经常会听到“渲染”一词,这是一个将计算机中存储的各种数据(Mesh,材质,光照等)通过一定的流程从而得到一张图片。而三维重建可以认为是这一过程的逆过程,即通过已有的图片,来还原一个三维的场景。
传统的三维重建技术一般有四个步骤:1. SfM(运动恢复结构)该步骤接受图像和摄像机内外参数作为输入,输出一个三维的稀疏点云2. MVS(多视立体视觉)该步骤将前一步的稀疏点云进行稠密化,进而输出稠密的三维点云3. 表面重建根据三维点云计算出三角网格4. 纹理重建通过输入图像为mesh计算出纹理
传统的三维重建很常常会出现模型有空洞和不正确的问题,并且需要很多的数据量,而且其中的算法颇为复杂。
NeRF OverViewNeRF对于传统三维重建技术最大的不同点在于,通过构建一个神经辐射场来隐式地表达了场景,而跳过了 ...
静态批处理 & 动态批处理 & GPU Instancing
Intro我们知道,在传统的渲染管线中,为了渲染一个物体,CPU需要向GPU发送一个DrawCall命令.比如下面这段代码:
glDrawElements(GL_TRIANGLES, indices->size(), GL_UNSIGNED_INT, 0);
而在下达DarwCall命令之前,CPU还需要设置好渲染状态,绑定顶点数据,绑定纹理,设置材质等等.比如这样:
glBindVertexArray(VAO); // 设置VAOmaterial->Use(); // 设置材质status->Set() // 设置物体各种状态//...glDrawElements(GL_TRIANGLES, indices->size(), GL_UNSIGNED_INT, 0);//DrawCall
值得注意的是,设置各种参数的操作费用不低,DrawCall也是一个非常费的操作(虽然现代图形API已经做了很多相应的优化).
这就出现了一个问题,看下面这个场景:
在这个场景中,各种各样的物体十分之多,如果每个物体都需要发送一次DrawCall命令的话,那么帧数将十分 ...
GOAP从理论到实践
Key ConceptsImplement Essentials一个Goal必须有以下内容:
Fixed Priority
IsValid(): 判断是否应该完成这个goal.如果Goal是kill enemy,那么首先得有enemy
Desired world state
一个Action必须有以下内容:
IsValid():判断是否能够执行,比如一个action 是 Goto pos X,那么这个函数就返回是否能够到达pos X(是否有路劲)
PreCondition: 执行动作的前提(可以为空)
World State:
本质上是一堆变量的集合
AI 持有一个当前的State
一般来说,一次只会关注world state中的其中几个
How to build a plan
按优先级找到第一个valid goal
找到一个可以满足goal的action
找到一个可以满足上面action 的前提的action
一直重复,直到和当前状态匹配
如果失败,那么找到第二个goal
将state看成一个节点,effect和precondition看成边,那么build pla ...
无题
Render Graph 是现代渲染引擎的一个中间层,下接RHI层,上接渲染管线.
为什么使用Render Graph传统渲染管线背景:
Render Graph 优势:
高效内存管理,只分配实际使用的资源 -一个pass的资源
自动处理同步点 -graph可以处理pass之间依赖
可维护性高 -pass高内聚,低耦合
名词
Render Graph: 渲染图,管理 Pass DAG
Pass: 一个完成的渲染过程,是Render Graph 的一个节点
主要原则
Resource Haldles:你无法直接处理资源,而是通过Handle来间接处理,如RTHandles,ComputeBuffers,RendererLists
资源访问限制:你只被允许在 Render Pass 的 Execution 中访问资源
显示Pass声明:你必须明确每个 Pass 读取和写入的资源
No Persistence每次Excute之间,资源没有持久性,即上次创建的资源无法在下一次中使用
持久性资源解决办法对于需要持久性的资源,你需要在Render Graph外部创建后导入.注意,Render ...
glTF格式入门(三)--Buffer,BufferView,Accessor
Buffer一个Buffer表示了一个二进制数据块.
BufferViewBufferView是对Buffer的切分.切分通过byteOffset和byteLength两个属性来定义.同时,每个BufferView对象包括了一个target属性,用于对BufferView引用的数据进行分类.
"bufferViews" : [ { "buffer" : 0, "byteOffset" : 0, "byteLength" : 6, "target" : 34963 }, { "buffer" : 0, "byteOffset" : 8, "byteLength" : 36, "target" : 34962 }
上图浅色部分(无意义部分)用于数据对齐.
34 ...
glTF格式入门(二)--glTF基本结构
glTF基本结构glTF文件本质上是一个Json文件,其描述了整个3D场景的内容.
glTF的元素可以将glTF的元素分为两类: 核心元素与拓展元素
核心元素
asset: 保留了glTF文件的元数据, 如版本号, 作者, 标题等信息.
scenes: 场景列表, 用于指定场景的层级结构.
nodes: 节点列表, 用于指定场景中的对象及其关系.
materials: 材质
meshes: 网格
accessors: 访问器列表, 用于指定缓冲区视图中的数据格式.
bufferViews: 缓冲区视图列表, 用于指定缓冲区中的数据.
buffers: 缓冲区列表, 用于存储二进制数据.
Textures: 纹理
Images: 图像列表, 用于指定纹理的图像数据.
Samplers: 采样器列表, 用于指定纹理的采样方式.
Animations: 动画
Cameras: 摄像机
Skins: 蒙皮
拓展元素拓展元素让glTF可以支持更多功能,比如压缩网格,透明材质,GPU Instancing等.
详细的拓展元素可以参考官方文档
外部数据引用二进制数据,比如3D对象的几何数据和纹理 ...
glTF格式入门(一)--概述
简介glTF(GL Transmission Format) 是一种3D模型格式.被称为是”3D”的JPEG.其主要优点有:
轻量化
快速加载
跨平台
包含完整3D数据,包括:
几何
材质
动画
场景结构与层级
为什么需要glTFglTF正如其名称所言,目标是在于作为一种便于传输的中间格式.
当前的各种3D格式并不能够方便地在互联网上进行传输,以及直接高效地进行渲染.glTF正是为了解决这个问题.
glTF相较于其他格式的优势在于:
OBJ: 简单,兼容好,但功能有限
FBX:功能强大,但专有格式,文件大
glTF:轻量,功能完全,便于传输.