0%

NeRF-3DGS


​ 找实习的时候也投了一些相关的岗位(三维重建、NeRF/GS等等),考虑到我本科是搞SLAM的,大四到研二上学期也断断续续做了一年半的NeRF,面相关的岗位时感觉还是比较轻松的,基本上比赛、开源项目吹吹水,回答一些简单的基础问题,做一些简单的题目就结束了,目前面试相关岗位还没碰上答不上来的问题。本部分 review NeRF 的基本工作,此前的 NeRF 项目、比赛以及 3D Gaussian 基本概念。

Read more »

HPC I


​ 投了几个 HPC 岗... 虽然不是科班出身,但个人觉得 HPC 还是挺有意思的(尤其是自己写 CUDA kernel 加速几百几千倍,那种成就感简直...)。HPC 的魅力之一在于,反馈非常及时:某种优化策略可能可以瞬间带来 profiling 时某一项的提高(比如 throughput, speed 等等)。我自己搞 rendering 的过程中也在不断尝试一些小的 tricks (比如SSE啥的,毕竟多线程这种东西根本不用我写... 随便拉出一个线程池来都是自带 scheduler 的...),感觉过程中还是能学到很多东西的,对 CPU/GPU 的各种设计也能有更深的理解。

​ 本博客是我认为比较重要的相关知识(第一部分)以及我觉得我可以回答的一些问题。

Read more »

Ada Path Tracer III


​ AdaPT 进入了 volumetric path tracing 阶段。由于本人的研究方向(暂定)为散射介质渲染的研究,了解基于 particles 的(Lagrangian表征的)散射渲染是非常有必要的(烟雾渲染多有意思,虽然现在只能渲染 homogeneous 介质)。vpt相对于无介质pt的主要难点在于:

  • volumetric path tracing 在采样层面上多了一个维度 --- 光线传播距离将不再是无穷远,需要采样其自由程
  • free space radiance 一致性不再成立,并且模型与表面散射模型有较大的区别。有许多额外计算需要完成
  • direct component 更难衡量,这意味着收敛更加困难。MIS 也不那么 intuitive 了
渲染4000迭代(25s,约10亿光线) 渲染20000迭代(约50亿条光线) 渲染15000迭代
Figure 1. 无介质的收敛性明显好很多

​ 话说,我写博客从来没有在一个系列上写超过两篇的文章,渲染技术系列已经三篇了,这还是头一回。

Read more »

Ada Path Tracer II


​ 本文为 Ada Path Tracer I 的续文。在上一篇博客中,我只是说明了 Monte Carlo 积分在path tracing中的应用以及path tracing的理论、实现流程。并没有深入讨论 PDF 如何计算、采样如何进行、PDF的选择如何影响结果以及如何使得 path tracer 具有更高的效率。笔者在本文中对上文未讨论清楚的问题进行分析。分析过程中我果真也发现自己之前的某些理解是不对的,实现时出了问题,例如在:Lambertian BSDF的实现、MIS 对无面积光源的处理、MIS weight计算等等方面均有瑕疵。

​ 本部分学习的结束标志着【基本 path tracer 实现】的完成(V1.0)。除了对BSDF进行小的修改之外(表面反射定义过于简单),下一步我将主要围绕两部分进行深入研究:

  • Bidirectional path tracing。双向 tracer 对处理 directional / collimated 光源十分有用,并且在caustic建模上有着更好的效果(虽然不是最好的)
  • Volumetric path tracing。主要研究匀质介质散射吸收。
Figure 1. AdaPT 2min增量式渲染(CPU,GPU时间除以8-10):点光源/顶部面光源与球面光源
Read more »

Ada Path Tracer I

​ Path tracing背后的概率与数学理论较为复杂,如果不深入理解则很难进行正确的实现,更勿论在此基础上进行创新了。结合笔者在实现过程中的一些体会,笔者认为非Whitted光线追踪渲染器有一个这样的特点:即使是很大的逻辑错误可能也很难使用定性的方法观察出来,最后的错误输出可能与正确输出仅有很小的差别,甚至有的时候根本看不出来(例如,算法收敛慢时我可能倾向于认为是自己没有用太多的variance reduction方法以及深入的采样技术,而不会认为我代码有逻辑错误)。故本文作为 Path Tracing 系列的第一部分文章,将尽可能深入讨论背后的理论知识以及其理解。理解是为实现、创新服务的,任何不到位的地方都将导致实现过程中的卡顿,故此处我将尽力覆盖这两周用零碎事件写渲染器: AdaPT时所遇到的问题。

写文档是很烦人的一件事,如果我本身很闲,不用为了各种学业、科研、个人资本等等事情考虑的话,我当然还是非常愿意写博客、写文档的。可惜写博客写文档从现在来看并没有实际的价值,只是我个人的自嗨。 --- 2023.2.8 何千越

"The cornell spheres" "The cornell boxes"
Figure 1. Ada-Path-Tracer 渲染结果(20s内)
Read more »

Taichi Lang II


I. Intros

​ 深入了解Taichi语言,简单的并行算法设计无法满足我(毕竟真要说并行算法设计,Taichi所需的工作量与CUDA暂时没办法比)。Taichi中重要的两个features:稀疏数据结构(SSDS),可微编程(differentiable programming)目前对我而言比较重要的就是SSDS,可微编程... 可微渲染可能可以用到,但是本身实在是太复杂了... 我一直觉得,不动手就学不到真正的知识,所以还是给自己布置了一道题,并且要求将SSDS以及在第一篇博客完成后学到的内容整合到此题的解答中。本文是最后一篇Taichi 入门博客,关于一些进阶的用法以及特性,以及在实现题目:flocking simulation(鸟群模拟)中所学到的一些知识。文末附有flocking sim的视频。

​ 预计我下一步将会使用Taichi写一个带有participating media功能的path tracer(3D,之前Rust + CUDA写了一个没开源的2D tracer,只能看光路,不能看渲染结果(毕竟是2D)),以加深我对光线追踪算法的理解。不过这是个大项目,简单版本的也至少涉及到mesh的读取、加载、光线弹射、采样、介质实现、蒙特卡洛积分等等... 想想就刺激。

frame 52 (红色为掠食者,白色为普通鸟) frame 58 (红色为掠食者,白色为普通鸟)
000052 000058
Figure 1. Flocking simulation with predators (64 regular boids (this is not a typo) and 4 predators)
Read more »

Taichi Lang I


I. Intros

​ 巨佬们的工作(胡渊明,李子懋 both from MIT CSAIL):

  • Taichi: A Language for High-Performance Computation on Spatially Sparse Data Structures. ToG 2019

​ 刚好最近工作与图形学高度相关,并且一直觉得自己Python方面的技术栈太浅了(语法、代码加速了解得不够深入),于是想了解一下这个语言(与Python高度耦合)。这个语言在前年七月我刚开始做毕设的时候Dinger就在絮絮叨叨说Taichi怎么怎么香了,当时也玩了几个demo,但没有去了解语言本身。最近开始了解后觉得,要深入了解这个语言还是需要一些外围知识的辅助(比如,学了CUDA、LLVM等则会觉得接受其设计思想是一件比较容易的事情)。学这个语言的目标当然是用Taichi写一个简单的 path tracer 出来叻...。本文的主要内容有:(1)这几天学习时遇到的问题(2)一些Taichi底层原理(3)Python decorator补充(4)自己做的一些小demo。

Figure 1. 混元形意太极 闪电五连鞭
Read more »

Ref NeRF复现


I. Intros

​ 科研恢复性训练。之前把CUDA加速的全并行shadow caster写完了,算是复习了CUDA、Rust以及FFI的使用。深度学习方面就以复现Ref NeRF为一个小任务。论文CVPR 2022 Best Student Honorable Mention: Ref NeRF - Structured View-Dependent Appearance for Neural Radiance Fields对反射现象进行了良好的建模。之前我一直在研究折射现象的NeRF建模,就折射建模思路而言,此文对我有很大的启发。并且个人认为,基于Ref NeRF以及mip NeRF作为框架是比较好的选择(除此之外就是要考虑如何让训练变快了,Instant NGP当然是不二选择)。当然,由于在复现过程中也遇到了许多问题,本文在阐述复现思路以及论文理解的同时,也会探讨踩过的坑。目前,Ref NeRF的复现结果还没有达到令我满意的程度,只是具备雏形,毕竟融合两篇文章的idea可能导致冲突,深度学习这种玄学就更是这样了,模型炸了都不知道从哪一个先开始。复现见 Enigmatisms/NeRF

Figure 1. Ref NeRF半成品(Shinny Blender - Helmet)。从左至右:RGB、depth与“奇怪的法向量”
Read more »

​ (未完成,请勿点击)Rust FFI(foriegn function interface)非常有吸引力,特别是当你用熟了nannou库之后(啊,nannou,比OpenCV香了不知道多少倍,OpenGL-base库牛逼!)。CUDA编程也属于很有吸引力的活动(谁会讨厌优化代码,在已经比多线程CPU快n倍的基础上看着它跑得越来越快呢)。两者放在一起只能说是让人觉得万事皆空。本文记录了在以下两个项目:

  • LSMv2:CUDA加速的激光雷达仿真器(simple 2D ray caster)
  • ShadowCaster:CUDA加速的空域计算算法(2D阴影投射算法)

​ 中,使用CUDA/Rust混合编程所遇到的/产生的:(1)语言方面的坑。(2)CUDA程序设计上的一些坑。(3)一些算法设计思路。

Read more »