渲染方程中的路径积分

路径追踪是第一个光线传输算法,并广泛应用于Realistic Rendering中。路径追踪将渲染方程的积分式转换成一个路径积分的形式,并且通过蒙特卡洛积分方法对每一项进行积分,从而得到一个统计上无偏的渲染结果。因为路径积分的无偏属性,路径积分也常常被用作为渲染的Ground Truth,用于对比其他的渲染方法。 渲染方程 要完全推导路径积分并且用代码表示路径积分的计算过程,我们需要从渲染方程入手。 首先需要明确的一点是,渲染的目标是计算最终进入眼睛(摄像机)的辐射亮度(Radiance),即单位面积,单位立体角上的光通量(辐射功率)。另外一个重要的概念是辐射照度,辐照度(Irradiance),即单位面积上光通量(辐射功率)。根据几何光学的线性假设,当光射到物体表面产生反射的时候,其反射方向的辐射亮度的微分,和入射方向上辐射照度的微分成线性关系。这两者比例常数由入射角$\omega_i$和反射角$\omega_o$和物体表面属性直接给出,我们把这个函数称之为BRDF(双向反射分布函数),$f(p, \omega_i, \omega_o)$。双向反射分布函数理解起来比较具有挑战性,一个简单的方法是将其辐照度和辐亮度类比为连续型概率的中的随机变量和累积概率函数,那么累积概率函数和随机变量的微分比值,即BRDF,就是概率密度函数。 $$dL_o(p, \omega_o) = dE(p, \omega_i) = f(p, \omega_i, \omega_o)L_i(p, \omega_i)cos\theta_id\omega_i$$ 有了BRDF函数,我们就建立起了,对于物体表面上的一个点,点$p$,其反射的辐射亮度$L_o(p, \omega_o)$和入射的辐射亮度之间的关系,进一步的,如果我们考虑$p$上的自发光的辐射亮度$L_e(p, \omega_o)$,那我我们就可以建立起渲染方程 $$L_o(p, \omega_o) = L_e(p, \omega_o) + \int f(p, \omega_i, \omega_o)L_i(p, \omega_i)cos\theta_id\omega_i$$ 如果我们只考虑不透明反射模型,而不考虑更复杂的折射和次表面反射,那么我们的积分范围即是围绕表面法线的半球积分。 方向积分形式和面积积分形式 从渲染方程中,对于$L_e$项是相对简单的,我们可以从物体表面材质定义获得。对于积分项,我们则需要知道每个方向的$L_i$。首先需要明确一点,在真空环境中,光在传播过程中,辐射亮度并不发生变化。对于$L_i$项来说,其就等于它来自方向的点$p’$的反射的辐射亮度。为了更好的表示这一点,我们用函数$t(p, w_i) = p’$表示。函数$t$指的是,从$p$点出发,沿着$w_i$方向,第一个相交的点,即为$p’$。由此,渲染方程可以改写为 $$L_o(p, \omega_o) = L_e(p, \omega_o) + \int f(p, \omega_i, \omega_o)L_o(t(p, \omega_i), \omega_i')cos\theta_id\omega_i$$ 然而我们无法显式定义函数$t$,于是上面这个式子就无法显式定义,对于上面函数的展开,则必然包含着一个关于函数$t$的递归项无法消除。这使得我们仅仅可能通过递归黎曼求和的形式得到积分结果,而无法使用诸如蒙特卡洛近似的方式进行数值上的快速拟合。 为了显式改写该函数,我们重新定义一些记号,用于方更方便阅读。 首先是反射的辐射量度和入射的辐射亮度。在光线传输过程中提到,对于真空来说,辐射亮度在传输过程中不发生变化。那么对于一个点的入射辐射亮度,即是其来自方向反射(或者自发光)的辐射亮度。于是我们是用$L(p_1, p_0)$记号替代$L_i$和$L_o$,其表示点$p_1$到点$p_0$的辐射亮度。 同样的,BRDF方程记号我们也可以做相应的变化,我们使用$f(p_2, p_1, p_0)$表示从点$p_2$出发,击中表面点$p_1$,发生反射到达$p_0$的光路的BRDF。显然,该表达方式蕴涵了之前的立体角,从而在数学上是等价的。 经过上面两次记号的变化,在表达式上我们已经消除了立体角$\omega$的存在,然而微分项$d\omega_i$依然存在,我们需要将该微分项同样转换为关于点的表达式。由于 $$\omega = \frac{Acos\theta'}{d^2}$$ 我们便将立体角的微分转换为对应顶点处的面积微分,为此,我们引入一个函数 $$G(p_0, p_1) = V(p_0, p_1)\frac{|cos\theta_0||cos\theta_1|}{||p_0-p_1||^2}$$ 其中函数$V(p_0, p_1)$为可见性函数,如果两个点相互可见,则$V=1$,否则$V=0$。 于是渲染方程可以改写为 ...

October 16, 2023 · Yiwei Gong

《动物庄园》自由和平等的谎言引发的独裁

一部小说描述的是故事情节,一则寓言揭示的是事物的本质。《动物庄园》出版于1945年,值二战胜利前夕。作者乔治.奥威尔在书中描写了一只猪引发的革命,随着时间推移,革命开始退化为独裁统治,并最终失败。 推想革命失败的原因,有人说是独裁政治,有人说是极权主义,这些当然是革命失败的显然因素。然而这巨大的不幸却一早就隐藏在了自由和平等的巨大谎言中。动物们的革命动力来自于老麦哲的美好愿景。肥沃的土地,丰富的食物,整个庄园都是欣欣向荣的样子。老麦哲宣告,推翻人类统治,建立一个自由与平等的庄园。动物们坚定不移的相信,自由和平等带来的是美好的一切,是没有压迫没有剥削的乌托邦的社会。 然而现实并不是如此。整一个自然界中永远不会存在自由和平等。无论是残忍的生存法则,还是一条条的生物链,都昭示着自然界对自由和平等嗤之以鼻。没有任何理由能说明为什么老虎可以吃别的动物,也没有任何原因可以解释为什么蚂蚁天生就弱小,被其他动物欺凌。动物们所谓的自由和平等绝不会催生出一个乌托邦一般美好的社会,而他们的信仰却成为独裁者的欺世的谎言。正如书中的动物们,他们不断被聪明狡诈的猪们威胁说,“你们可不想琼斯先生回来吧。要是琼斯先生回来,我们就再也不会有自由”。动物们都害怕失去自由,然而动物们却都不知道到底什么是自由,谁也无法定义什么是人人平等。所有人知道的,便是记着老麦哲的美好愿景,他们误以为,那是自由和平等带来的未来。这样不明就里的相信,使得信仰变成了统治者统治的工具,信心成为独裁者控制的最佳法器。 反过来问,我们的世界是否要自由和平等。需要的!我们需要的自由是一套完整制度,完整法令保护下的人格的独立。法国大革命《人权宣言》对自由的定义是:“自由即有权做一切无害于他人的任何事情。”在二战中,罗斯福提出了四大自由:“言论自由,信仰自由,免于匮乏的自由和免于恐惧的自由。”在联合国人权宣言中,四大自由被重申。反观《动物庄园》中动物们的自由,却哪里找得到言论,信仰,免于匮乏和恐惧的自由。反而较之以前,动物们被更多的剥削,这一点从鸡们被麦哲伦要求上缴更多的鸡蛋就可以看出。但是具有讽刺的是,动物们并没有马上意识到自己被愚弄,动物们心中所想的事,反而是需要更加努力的工作。比如Boxer就是一个典型的例子,他从最开始和小公鸡约定要提前半小时起床工作到后来的提前一个小时提前工作。Boxer是革命的忠实拥护者,他小心翼翼的维护者革命的成果,他更加是自由和平等的拥护者。但是正因为他的固执地坚信老麦哲的政治思想——即自由会带来丰收,而无人类的约束即是最大的自由。他的固执使得他深受毒害,最终也造成了他惨死悲剧。 作为寓言故事,《动物庄园》影射了当时俄国从十月革命到1940年的历史过程。其实在现实过程中,不乏这样的革命者。中国历史上垒起呐喊着消灭暴政的各样农民起义,最终沦为新的苛政。而作为革命的主题的农民们,依然把持着美好的愿景,甘心的被奴役。着眼于中国现代史,这样的事件也屡见不鲜。革命者曲解社会主义,塑造了共产主义的美好愿景,却直接导致了大跃进等经济上的严重倒退。 那么我们需要什么样的自由和平等?动物们所需要的,不仅仅是一个美好的愿景,不仅仅是一场革命,不仅仅是推翻一个领袖,不仅仅是七戒这样的一张宣言,更不仅仅是一个能带领动物们走向自由的麦哲伦一般的领袖。他们需要的是一套制度以及能使这套制度运行的动力。而动物们所想的自由,所想的美好愿景,是这一套法律能够给予保护的人格的独立。动物们需要的是一套法案,他规范了所有动物的职责,任何超越这些职责的动物都应当受到谴责。他限制了所有人的职能,没有一个人——比如麦哲伦——可以独断的决定一切。当然动物们还需要的是带动整个社会运作的动力。从动物们的风车计划就可以看出动物们并没有能力支撑起他们小小庄园的运作。他们松散的结构根本无法供给自身。这样一个缺乏能量来源的乌托邦社会,最终沦为麦哲伦手中的玩物,和人类大摇大摆的做起交易,并安上了一个救世主的美名。 我们无比渴望自由,但是正如孙中山先生所说,这个世界上没有绝对的自由。在此告诫改革者们,即使是一套有漏洞有缺陷的制度,也远远比假大空的空想愿景更好。

December 24, 2020 · Yiwei Gong

Asynchronous function in Unity

Async and await keyword Since Unity 2019, Unity introduces C# task and async/await keyword to MonoBehaviour. For Unity callback functions like Start, Update, now it supports the async version, and with the async keyword in the front, the function now will be dispatched asynchronously automatically by the engine. private async void Start() { Debug.Log("Start task delay 2 seconds"); await Task.Delay(TimeSpan.FromSeconds(2)); Debug.Log("Task delay 2 finished"); } The function on the above will be executed and the first log shows immediately while the second log shows after 2 seconds. The C# build-in HTTP library also provides a nice async wrapper, which can be used in the asynchronous MonoBehaviour as well. ...

November 16, 2020 · 4 min · 848 words · Yiwei Gong

Rendering Equation

Presentation of Rendering Equation

July 12, 2020 · Yiwei Gong

The Last of Us

上个星期的时候,玩完了The Last of Us,还有DLC – Left Behind。玩完的时候,有一种怅然若失的感觉,一直想写一篇文章来结束这20小时的故事,但总觉得不知道感情的着落点在何处,甚至沉思了许久,写了又删,结果便是连开头都没有挤出一点。 这个星期意外的发现,顽皮狗在游戏中专门放入了特典,对游戏中的每一段CG都加入了两位主角主演,以及编辑的一些评价。原本便意犹未尽,于是这周,把所有的CG以及顽皮狗的制作特辑都欣赏了一遍,总算可以来一个告别,以至于愈发觉得有必要来写一些什么。 在The Last of Us之前,我才刚刚结束顽皮狗的神秘海域系列。大概是一个星期的时间,每天晚上都在玩神秘海域。一口气结束了神秘海域1-3合集,神秘海域4,还有大型DLC失落的遗产。第一次接触神秘海域4,被完美壮阔的风景所惊艳,然后是神秘海域2的火车剧情更加是惊叹不已,再到最后的遗产,开始慢慢发现固定的好莱坞式剧情,随后玩法的慢慢重复,角色性格固化,便不难理解顽皮狗宣布神秘海域全系列终结的原因。一度讨厌“恐怖游戏”,一直不太喜欢僵尸题材,但因为对顽皮狗的喜爱,开始尝试The Last of Us。结果没想到的是这个游戏给我了PS4上最大的惊喜。 序章开始的时候,Sarah被士兵无情的杀害,Joel在Sarah去世前,无助和痛苦成为了他这二十年对这个世界的报复。Bill说过一句话,在这个末日的世界中,你不能关心别人,因为他们最后只会成为让你被杀害。顽皮狗并没有告诉我们Joel这二十年到底经历了什么。但是从他的行为,其他角色的只言片语中知道,他并不是英雄,甚至连好人都不是。 第一次Joel带着Ellie穿越军事防区的时候,Joel随手杀死了守卫的士兵。Ellie问Joel,你杀过很多人么?在经历了这么多游戏,会突然觉得很神奇。以前,每一个游戏都是主角一路突突突,遇神杀神,遇佛杀佛,仿佛死亡是一件很轻松的事情。然而在The Last of Us中,顽皮狗无时无刻不在渲染死亡的恐惧。亏缺的物资,漫长的击杀CG还有无处无在的感染者。杀人变成了一件不得不做的事情。 所以Joel一定不会为了Ellie付出自我。一个莫名其妙的小女孩,甚至是一个被感染者。在这样的一个末世,对别人的任何一点更多的关心,都会招来杀身之祸。你能做的,就是对一切事物冷漠,自私自利。 但是Joel并不讨厌她。甚至Joel会在那么一两个地方,被Ellie的坚持和勇敢所感动。但是Joel并不是一个善于表达的人,也更不会对Ellie敞开心扉。Sarah的去世已经让Joel对这个世界彻底失望。更何况,对Ellie倾注多一点点的情感,在这人人自危的末世,指不定哪一天失去Sarah的那一幕会在Ellie身上重演。 为了强化这种情感的羁绊,编剧甚至引入了Henry和Sam俩兄弟。Henry就像是Joel的侧写,一个Joel善良一面的侧写。为了Sam,Henry可以付出一切。他们自私,在危急关头抛弃Joel和Ellie逃跑。他们依然善良,在Joel和Ellie落水后,把他们救上岸。Henry对Joel说,换作你你也会这么做,为了保护她你不惜牺牲一切。这是第一次——编剧透过第三人称告诉我们——Ellie在Joel的心中,就好像埋下了一颗种子,在未来的某一时刻,会发芽,然后爆发,最后Joel彻底接受Ellie。 Sam被感染的时候,Henry无奈之下,枪杀了Sam。Henry在自杀前,用枪指着Joel说,喃喃自语,it’s all your fault。“你”当然指的是Henry自己。编剧用Henry和Sam讲诉了一个Joel和Ellie的侧写。在世界末日之时,谁也不知道明天会是如何。也许在Ellie会变成另一个Sarah,而Joel则变成下一个Henry。Joel从来都没有表示什么。他杀人依旧是那么利索可怕,甚至折磨起人来也丝毫不手软。然而我们却那么深刻的感受到,Joel所害怕的便是在他眼前失去Ellie,就好像二十年前失去Sarah那样,以至于Joel是如此希望弟弟Tommy能代自己护送Ellie找到火萤。 直到Joel找到出走的Ellie,Ellie当着他的面说,你到底在害怕什么,而我比你更害怕,身边的所有人不是抛弃自己便是死去,只有Joel带着自己走过这么多困难。Ellie把Joel视为父亲和唯一信任的人。而Joel却因为害怕而不敢接受她。直到Ellie说,I am not her。也许这是二十年来,第一个对着Joel的面说起Sarah的人,而这一下,也彻底击中了Joel心中善良柔软的那部分。 故事进入后半段。两个主角从陌生人,开始真正变得互相依赖。Joel会跟Ellie说Sarah。他说,如果Sarah还活着,她和Ellie一定会是好朋友。Sarah一直是Joel的善良和柔软的那部分,也是在这个末世下,Joel身上剩下的人性。而终于在二十年后,被这个陌生的小女孩唤起。 也许编剧觉得这么多还不足够让Joel彻底的把Ellie当作自己的女儿,于是便精心策划了Joel的受伤。全篇只有一章,玩家可以从Ellie的视角去看世界。Joel的重伤把这个冬天变得特别难熬。Ellie学会打猎,从一个被人照顾的小女孩,开始担负起照顾Joel的责任。甚至为了保护Joel,不惜引开敌人而不幸被抓。 于是,编剧告诉了我们这个世界真正邪恶的一面。人们因为食物匮乏而互相杀害,甚至是吃人也正常不过。Ellie无疑坚强,勇敢。然而在Ellie杀死David的时候,Ellie的情绪已经在奔溃边缘。前来救Ellie的Joel冲进来抱住Ellie,这是他第一次抱住Ellie,也终于,Joel真正接受了父亲这个角色。 经历了人间最恐怖的地狱以后,故事给了我们一个巨大的温馨。看着长颈鹿在废墟缓缓的走动,看着Ellie活蹦乱跳的样子,我们暂时忘记了一路过来的血腥和恐怖。Joel对Ellie说,我们可以不必这样。Joel已经无法再失去Ellie,更不愿意她受到任何伤害。 在他们到达医院之前,Ellie溺水了。Joel手足无措,他只想就活Ellie,甚至在士兵靠近,枪抵着脑袋的时候,他还在抢救Ellie。编剧把二十年前,序章里Sarah的意外投影在Ellie身上,在Joel第二次经历到的时候,我们就好像Joel一样,无论如何,不能再失去Ellie了。 对啊,去他妈的拯救世界。 不是好莱坞电影中英雄般的结局,甚至反派都不能称作反派,更加的,连BOSS战都被CG带过,然而当看到穿着手术服的Ellie静静地躺在车后座,多少人像我一样,还好,Ellie还活着。只有Ellie或者,全世界都死了又怎么样呢? 当世界有了声音,人们便听到了别人所听到的。当世界有了画,人们便见到别人所见到的。当世界有了语言,人们便联想到别人所想到的。当世界有了电影,人们便经历到别人所经历到的。而当世界有了游戏,人们便听到了,见到了,联想到了,经历到了所有的一切。谁说游戏不是艺术呢? 顽皮狗大概是这个世界上最会讲故事的游戏公司。从来不觉得,李逍遥就一定要保护灵儿回苗族,从来不觉得因为父亲,劳拉就一定会成为古墓丽影。所有的故事都在为发展找铺垫,找借口。而顽皮狗却因为铺垫而展开故事。而作为玩家,在这十五小时,拿着手柄和Joel,和Ellie一起走完这一整年的旅程,愈发地从内心,和他们产生一样的情感共鸣。 总觉得说什么都不够评价The Last of Us。但如果硬要说一句感受,大概是这么一种感觉: 想马上出门,买一台PS4和The Last of Us,然后封藏在地下室。等多年后,我有了孩子——最好是女儿——然后在她十四岁的时候,送她The Last of Us,然后和她一起经历Joel和Ellie的这段故事。

July 8, 2018 · Yiwei Gong

满江红·二十三生日所作

家住江南,又到了,初春颜色。南洲处,几番风雨,几番漂泊。五载年华弹指去,此为蜗角须臾国。笑尘埃、二十三年非,长为客。 停云处,青山碧;谪仙诗,追黄鹤。叹营营众宦,诛文伐墨。千百年传吾辈话,岂能未老头先白。吐狂谈,欲与古人歌,同君乐。

February 28, 2017 · Yiwei Gong

谢池春

岁晚蓝田、曾是将军飞虎。罢南山、桑麻社曲。雕弓花射,醉言英雄故。客长亭、霸陵羁旅。 江边老叟,拟泛扁舟吴楚。梦干戈、伤心柝鼓。吾庐寒小,未得刘郎顾。看江山,一蓑烟雨。

April 30, 2014 · Yiwei Gong