Neural Network Lightmap | 神经网络光照贴图

live demo: Neural Network Lightmap (ma-yidong.com) 问题与猜想 众所周知,Lightmap是一种古老的预计算光照模拟GI方法,可以将间接漫反射信息烘焙到场景物体的UV上,在运行时通过一次UV采样即可获取漫反射GI信息。这种技术在本世代低端设备如移动设备、Web端以及PS3/4时代均有着广泛的应用。当然,本世代最新的GI技术如Lumen等对于动态光照有着更强的处理能力,但对于纯静态的光照,lightmap技术仍然是一种很好的方法。 假设场景是完全静态的,只有视角变化。在这种前提下,lightmap仍然存在一些不足,主要是对于复杂光路的不支持。比如Specular,仍然需要实时计算Punctual Light/EnvMap的BRDF来获取。至于更复杂的光路,如Subsurface Scattering,仍需要BS...
Read More

Game Art Trick – Light Field and Imposter | 游戏美术技巧 – 光场与公告板

鸽了两个月回归。 笔者了解基于图像的方法时,初听感觉没有什么特别,但细细想来忽然感觉其实以前遇到的不少美术技巧都是和这个原理相关的。当时不知道这些技巧如何被人想到,如今才发现与图形学有其相通之处。因此这里整理成文。毕竟理论水平还要学习一个,大概只能给读者一个定性的认识了。 图形学中有两类文化-基于物理的(Physical Based) vs 基于图像的(Image-based)。前者是一种原子论的方法,演绎的方法,比如PBR,希望通过对现实世界的物理建模,还原现实。后者是一种整体论的方法,归纳的方法,对现实世界做整体性和经验性地描述而不那么关心物理变量,比如光场方法。游戏中,我们使用前者的时间比较多,光照模型PBR等等,本身就是希望接近物理现实的。后者也不完全是没有,比如用材质扫描方式生成贴图。 光场是一类表示方法,是上文提到的后者-基于图像方法-中的一种典型方法。英文...
Read More

Economize Your Texture | 如何节约贴图

做游戏时,我们的硬件资源不是无限的,而其中内存(显存)又是很容易紧缺的一个环节,而其中贴图又占了大头。如何节约贴图?是我们做资源管理时不可忽视的问题。 本文做一个个人的总结,主要在美术/TA制作的实践方面,也会简单扩展到压缩算法。而这些不同的方法,归根结底其思想也是共通的,甚至与别的领域,如音视频压缩,神经网络压缩有异曲同工之妙。以下分为几种重要思想描述: 重用量化特征降维频域分解 1. Reuse | 重用 Tiling | 连续贴图 当然这没什么好说的,一般分成 四方连续-即贴图四个方向都可以连续二方连续-即贴图在左右或者上下方向可以连续 用连续贴图可以让贴图在一或两个方向上重复,减少总贴图大小。四方贴图一般就是基础的地面墙面上会用。而二方连续贴图用处用处更广,可以单独做一张Atlas,一般成为Trim Sheet。也可以和非连续的部分放在一...
Read More

Realtime Physical Based Rendering, a Personal Outline | 实时基于物理的渲染-个人的大纲

什么是Physical Based Rendering? PBR到底包含什么? 一般离线渲染中PBR包含内容很多,从材质到灯光到曝光等。但是,在很多游戏PBR教程中从microfacet model,BRDF, 材质属性,辐照度开始讲,有时候也只讲材质。个人感觉对于新手来说很容易一下就掉入细节中,感到挫败和丧失兴趣。同时比较肤浅,没有考虑到PBR的各个方面。 由于实时计算机图形学有着硬件性能的限制,导致对于PBR不像离线有蒙特卡罗路径积分等统一的方法,而是对于各种特殊问题都有很具体的特殊解法,也更造成容易掉入细节中。 笔者这里尝试从光路开始分析,不用数学公式。从直观角度描述基本概念,讲解PBR有什么问题,在实时领域是怎么解决的?从而让读者快速得到一个宏观图景。 1. 渲染方程 尊重一下历史,我们从最著名的Kajiya渲染方程讲起。一个非常暴力的简化:渲染方...
Read More

BxDF Truth to Realtime with Mitsuba. A case study of Fur BSSRDF | BxDF从真实到实时,以毛发为例

在写GAMES101大作业时,在Mitsuba里实现BxDF, 遇到的很大一个问题是, 怎么知道渲染结果是'物理正确'的? 我们凭什么相信渲染器或者游戏引擎的渲染结果,是“物理正确”的?如果不是物理正确的,限于模型和计算性能的限制,什么损失了? 要回答这个问题很不容易,不是所有引擎和渲染器都是开源的,也不会有时间去研究所有渲染的代码。 当然我们知道,PBR不仅仅是材质,还包括灯光,相机。有关PBR一个集大成的talk是来自Frosbite的Moving Frosbite to PBR. 材质BRDF只是其中很小一部分了。当然本文也只讨论材质(BRDF)了,仅仅以自己尝试实现一个实时的毛发渲染为例子。 笔者这里想实现的是,Yan Lingqi教授的An Efficient and Practical Near and Far Field Fur Reflecta...
Read More

[Translate]Reverse Engineering the rendering of The Witcher 3 III | [译]巫师3渲染逆向工程 3

原文参见 Reverse engineering the rendering of The Witcher 3: Index 这是第二篇,翻译原文13-15节。由于文章太长,而且废话较多,这里先做个简单的摘要吧 摘要 13介绍巫师嗅觉的效果实现,其中, 13.a-介绍如何通过stencil 操作获得蒙版 13.b-介绍了如何做描边 13.c-把所有结合起来,还加了暗角,拖影,鱼眼等效果 14-介绍了云的渲染,主要用层积云作为案例。云是用贴图做的光照计算 15-介绍了雾的计算,这里雾不是完全的体积雾,但是做了raymarching计算,受光照和高度影响 13.a "巫师嗅觉" 目前为止,本系列中解释的几乎所有效果/技术都与巫师3无关。你几乎可以在每一款现代电子游戏中找到tonemapping, 暗角或计算平均亮...
Read More

[Translate]Reverse Engineering the rendering of The Witcher 3 II | [译]巫师3渲染逆向工程 2

原文参见 Reverse engineering the rendering of The Witcher 3: Index 这是第二篇,翻译原文9-12节。由于文章太长,而且废话较多,这里先做个简单的摘要吧 摘要 9-中介绍GBuffer的组成,讲了一些特殊的操作,比如Best Fit Normal,比如降饱和度。另外神奇的是巫师3并没有使用PBR,毕竟是2015年的游戏。 10-中介绍了远景雨幕,其实是一个圆柱上通过噪声滚动做出的 11-介绍了闪电的做法,是一个树状的mesh渲染出的,可以做粗细远近变化,并且加了一些随机效果 12-介绍了天空的渲染,包括大气散射,太阳和星空的渲染,星空是旋转的天空盒,并做了随机闪烁 9 GBuffer 这是我系列的第9部分这部分我会揭示巫师3的gbuffer的一些细节假定你了解延迟渲染的基本...
Read More

[Translate]Reverse Engineering the rendering of The Witcher 3 I | [译]巫师3渲染逆向工程 1

原文参见 Reverse engineering the rendering of The Witcher 3: Index。作者目测就是波兰人。这个系列总共15篇,作者发布跨度接近两年。其实介绍的算法并不复杂,前几篇甚至感觉很基础。但是方法非常新奇。经典的逆向工程文章大多是截几个图,描述一下做法便了事,这篇直接逆向工程shader的汇编代码,非常开眼。作者甚至自己写了个工具可以直接将HLSL代码转成汇编代码。不愧是波兰蠢驴。 本文是为上篇,翻译原作的第1-8篇,其余留待下篇。 第一部分, Tonemapping 大多数当代3A游戏中,肯定有一个渲染阶段是 Tonemapping 。快速回忆一下,现实世界中有很大的亮度范围。但是我们的计算机屏幕只能显示有限的范围,比如每像素8bit,只有0-255. 这就是有了 Tonemapping 的原因。因为它允许我们把很宽的亮...
Read More

On Mesh Cloud Rendering – Reimplement Sea of Thieves’ cloud | 模型云渲染-重现盗贼之海的云

Sea of Thieves, Tech Art and Shader Development中提到了他们的云的渲染方法,非常的trick和cheap,对云的渲染模型做了相当大的简化,然后却还有不错的效果。笔者这里尝试重现Sea of Thieves中云的做法。原作在视频中给出了很多细节原理,笔者这里给出一点补充。 本文的代码,模型,houdini预计算文件在Github可获取: Mesh-Cloud-Rendering 1. 体渲染原理 首先我们回顾一下体渲染的公式 体积渲染图解,来自RTR4 体积渲染公式,来自RTR4 体积渲染的原理可以用上面这个图解和公式表示。 这个式子有两项,p点是视线上第一个不透明物体,c是相机,v是视线 前面一项是p点到c点的透射度(Transmittance) 乘以 p点的颜色后面一项是一个视线路径的...
Read More

A Short History of Parallax Occlusion Mapping/Relief Mapping | 视差贴图,一个简短的历史

上图:左-法线贴图,右-视差贴图 我们常用法线贴图模拟表面的细节凹凸,不过法线贴图的一个问题是在视角很低(Gazing Angle)时会出现失真。 主要原因是法线贴图不会考虑高度的遮挡关系,因此有一些被遮挡的面会被渲染出来。解决这一问题的方法主要有两种: Tessellation, 通过细分增加面数,使得面片具有高度。Parallax Occlusion Mapping/Relief Mapping,通过在贴图空间中根据视线的方向,通过与高度图求交,获取到真实应该采样的UV坐标。 第一种方式增加了顶点和面数,对vertex/hull tess压力较大,而后一种由于需要多次采样高度图,对pixel shader压力较大。以下主要讨论POM/Relief的原理和一些修正。 1. Offset Limiting Parallax 最早是2001年...
Read More

Hair Rendering and Modelling – An Intro | 头发渲染与建模 – 简介

这篇中回顾了头发渲染模型的历史和一些实现细节,尝试使用Ornatrix建模头发,并在Unity中重现了UE中的Marschner模型,添加了eccentric参数。 1 渲染   1.1 Kajiya-Kay     最早研究毛发渲染的便是Kajiya和Kay,他们在1989年提出了Kajiya-Kay模型。这也成为了实时图形学的标准方法,甚至在30年后的今天,大量游戏的头发还是使用的这个模型。Jim Kajiya应该是个日裔,他在Utah大学完成的博士学位,目前还在微软研究院工作。他因为对毛发渲染做出的突出贡献,获得了1997年的奥斯卡技术贡献奖。   在游戏中使用这个模型还要追溯到GDC2004的Hair Rendering and Shading这个Talk,主讲者Thorsten Scheuermann来自AMD。PPT中比较详细地描述了kajiyakay模型和一些hacking技...
Read More

Construct BVH with Unity Job System | 用Unity JobSystem构造BVH

BVH 是一种空间存储数据结构,便于空间查询。类似的空间查找方法还有BSP,Octree等等。 BVH的构造/查询比较快,空间冗余也比较少,在实时图形学领域用的比较广泛。比如NVidia的RTX技术,就是硬件固定管线实现了BVH便于RayTracing加速。   构造BVH或其它空间查询结构对于渲染剔除,物理计算,粒子/boid/swarm系统通信等等都是很重要的,ECSPhysics这个项目是实现了BVH的,不过抄完测了一下感觉这个BVH构造的不对啊。于是找到BVH有并行算法实现,非常适合用Unity JobSystem多线程构造。于是基本参考了Thinking Parallel, Part III: Tree Construction on the GPU这篇经典文章自己在Unity中实现。   构造BVH的基本流程:1. 构造Z-Order 2. 排序 3 构造子节点 4 构造内...
Read More

Real-Time Renderting 4rd Reading Notes Chap3-8 | RTR4阅读笔记 3-8章

基础的就不细说了,这里主要记一些重要的点 第三章 3.1 并行架构 GPU是高吞吐的,定义为数据处理的最大速率,也是低缓冲的,没有缓存和控制逻辑。采样贴图因为资源不在缓冲,可能很慢,要几百个时钟,这期间gpu会切换到处理另一个fragment,切换是很快的。以此处理了很多fragment,第一个贴图采样终于好了,gpu会回来执行第一个fragment。 这个架构中,通过切换fragment让gpu保持繁忙,把延迟隐藏了。还用了一种SIMD的设计,让多个线程(thread)锁步(lock-step)执行同一命令,好处是能耗和晶体管数量减少了。这多个线程成为一组,NV叫warp,AMD叫wavefronts。每组可能有8-64个线程,每个线程有一个SIMD赛道 比如我们有2000个线程,每个warp32线程,所以总共63个wraps。每个wrap锁步执行,执行到某个指令比如贴图采...
Read More

Splat with 256 Texture – Review on MegaSplat | 256套贴图混合地形-MegaSplat回顾

最近看到MegaSplat这个插件感觉很有意思,在这里做一介绍。作者Jason Booth是有二十多年经验的程序员,现在是Disruptor Beam工作室的客户端和图形架构师,最近unity官方博客还推了行尸走肉:行军作战移动端优化经验,便是这位大神所写 MegaSplat是一套地形的shader,支持很多的feature,另外有写的很好的顶点色绘制工具,shader编译代码,以及最重要的,用顶点混合256张贴图的方法。 雪的混合,代码在DoSnow函数中,基本思路是用height和ao来生成一个snowAmount,这个snowAmount来lerp颜色法线等等 比如还有岩浆,下图是unity截图,在DoLava函数中 比如还有小溪, 在DoPuddle里,会有泡沫和水波涟漪的计算,另外还会用法线重采样原有地形贴图造成折射效果 另外还有tessellation,triplar,pa...
Read More

Real-Time Rendering 4rd Chapter 14 Reading Note | RTR4第14章笔记-体积与半透明渲染

Real-Time Rendering出第四版了,新增了不少内容,这里做一些笔记,一章一章来。   有一些介质,比如水 雾等,分子比较稀疏,和光作用时效果不同于普通BRDF,会有散射(scattering)。另一些较致密的物质也有散射。其实普通的diffuse颜色也会有散射,只不过作用尺度很小,比如小于一像素。所有物质都会散射 14.1 散射理论 14.1.1 介质材质     吸收(Absorption),光子成为物体内能     向外散射(Out Scattering),光子没有按路径继续向前,而是被扩散向周边,取决于相函数     发光:物体内能太高会发光     向内散射(In Scattering):环境光被散射进入光线路径         定义了灭绝度(extinction),是吸收和向外散射之和。   所以颜色定义成散射与灭绝之比 散射少吸收多:黑烟 红酒 散射多吸收少...
Read More