实时渲染:屏幕空间反射SSR

从上次面试之后,就寻思着用Unity做一些实时的渲染效果,这个时候就想起了GAMES202作业中的实时屏幕空间反射。

屏幕空间反射效果可以产生微妙的反射,模拟潮湿的地板表面或水坑。这种技术产生的反射质量低于使用反射探针或平面反射(后者可以产生完美平滑的反射)。屏幕空间反射是用于限制镜面反射光泄漏量的理想效果。

屏幕空间反射的本质是利用GBuffer中的Normal, Albedo, Depth几个分量进行屏幕空间(以及view space)的RayMarching,简单的做法是,从摄像机发射一条光线到每个Shader fragment,再根据fragment的法线计算出reflect方向,这样就相当于得到了一条ray的origin和dir。这个时候我们再将步进的射线的z深度与depth texture的值进行比较,即可得到是否intersect,进而进行反射颜色的计算。

实现

首先给Unity的摄像机加上一个material和shader,用类似于opengl的blit方法将渲染目标更改为一个texture传输给shader,这里因为Unity好像没有提供WorldToView矩阵,我们需要自己传给Shader,同时由于需要使用GBuffer中的信息,需要将渲染模式改为deferred(其实也不是必须的,但是使用前向渲染模式需要自己手动额外渲染所需的信息,会造成资源的浪费)。

阅读更多

面试:腾讯IEG光子游戏客户端开发

注:博主目前仅进行到一面,后续没有出结果,疑似凉经

2月份的时候估计回不了学校,考虑到下半年可能回不到学校,于是预计会在本地实习一段时间,第一个投递的岗位是腾讯IEG,找了一个学长->同学内推,本来一开始想的是在成都天美就地实习,但是貌似天美不太看得上我的简历(泪);后面听学长说我的简历被深圳光子捞了,问我能不能去,想了想大概暑假是可以过去实习的,于是跳过了笔试,在3月8日进行了第一场面试,由于这是人生中第一场面试,所以在这里记录一下。

一面

一面面试官应该是一个做客户端渲染方面的腾讯员工,态度非常好(我的第一次面试,好评),主要是负责面试我图形和引擎方面的问题。首先根据我的工作意向提出了以下的问题:

  • 考虑来深圳工作吗?实习之后考虑转正吗?
    • 可以暑假实习;实习之后会考虑转正。
阅读更多

信号图像处理:傅立叶变换与频域分析

最近在QQ群里看到了下列一则消息:

豆瓣在网页和APP中加入盲水印 可追踪截图用户

豆瓣在15日于其网页版标题下方加入了一行小字,内容是uid、tid和截图时间。这些文本颜色与网页背景色大体接近,肉眼无法直接分辨,如果有人截图通过调节对比度就可以显现出来。豆瓣可以轻松追踪截图者是谁。

在被曝光后豆瓣已将该部分设置为禁止选中。另外豆瓣早在2021年已经在其App中加入了类似功能。

隐写技术并不是新鲜事,其它互联网公司也早有应用,甚至更加先进。

在此前阿里巴巴月饼事件中泄露内网截图的员工虽然对图片做了处理,但是依然可以通过频域手段添加的数字盲水印精确定位到泄密员工。知乎用户 fuqiang liu 经过测试,使用涂抹,剪切,放缩,旋转,压缩,加噪,滤波等手段无法过滤这种盲水印,唯一的办法是对屏幕拍照。但是,依然可以通过文本间距等手段区分不同用户。审查者在这方面有很多技术选项。

有不少同学十分好奇其中提到的“通过频域手段添加的数字盲水印”是如何实现的。对于初学者而言也确实很难将一张图片与所谓的频率联系起来,那么到底什么是数字图像的频域分析呢?

傅立叶变换

引用一段Wiki对于傅立叶变换的介绍:

阅读更多

杂谈:进行全麻手术是怎样一种体验?

年前因为某些原因需要进行颈部的全麻手术,也是我人生中第一次进行全麻手术。我一直都是对于现代医学持敬畏的态度,对于全麻的体验是非常期待的(又有哪一个程序员能拒绝一次立即入眠的体验呢?)

术前

手术需要提前大概3、4天住院,主要目的是进行相关的各种术前检查,大概就是在病房里护士来给你抽血啥的。看了一眼医生开的单子,我需要做的手术是吸入式的麻醉,于是进行了一个挺有意思的麻药测试,麻醉医生会把麻药滴在鼻腔和喉咙处,然后伸进去一个管子查看鼻腔的通气情况,有趣的是在滴入了麻药之后,我似乎无法作出吞咽这个动作,可能是喉咙处的神经被麻痹了而无法很好地被大脑控制的缘故。

术前检查做的差不多了,医生提前一天拿着好几张单子来找我签字,上面的内容都十分的吓人(PS:感觉到医院里签的各种承诺书、知情书内容都相当可怕),包括但不仅限于:术中、术后发生的各种意外情况,但是这单子不签这几天院就白住了,签呗,相信医学。遂被医生告知星期一早上8点半手术,我估计在第一床或者第二床的排班上,还给了一套衣服叫提前穿上。

手术

阅读更多

PBR读书笔记四:Sampling Theory

对图像的描绘,本质上是场景重建(reconstruction)信号处理(signal processing),简单来说就是用离散的采样(像素点)来对连续的真实世界进行重建,那么就涉及到采样(sampling)的问题了。

傅立叶分析

傅立叶分析可以用来评估重建函数的质量,同时其被用来在频域上分析不同频率的函数,通常来说,高频率的函数变换的较为频繁、较快;低频率的函数变化的较缓慢。如下是两个函数图像:

7m6Gb6.png

与之对应的,是其在频域上的函数图像:

阅读更多

PBR读书笔记三:Color & Radiometry

众所周知,自然、物理界的光照不是靠RGB三个离散分量描述的,而是由不同强度的不同波长\(\lambda\)的光组成的,因此如果要基于物理地渲染,对于自然光谱的模拟是必不可少的,在pbrtmistuba两款渲染器中,都采用了Spectrum类来承载光谱数据,对于不同波长的数据,我们描述为SPD,aka spectral power distribution,光谱能量分布。

Spectrum

自然界光谱不是离散描述的,于是我们可以像傅立叶变换一样,用一组带系数的基底函数\(c_iB_i(\lambda)\)来逼近实际的波形。

pbrt中,定义了两种实际的Spectrum类,并且使用一个typedef来在实际的使用中切换两者的类型:

1
2
typedef RGBSpectrum Spectrum;
// typedef SampledSpectrum Spectrum;
阅读更多

PBR读书笔记二:Basic Shapes

在整个图形学领域,空间中的物体都是由基本的Shape构成的,比如基本的几何形体:Sphere、Box;或者能够达成更加复杂表现的Mesh等。这一章主要讲述了几种不同的形体的定义和相关计算。

形体基类

PBRT使用Shape类来为所有形体创建了一个基类,reverseOrientation用来决定图形的法线是否翻转(用来确定图形的内、外)。

对于每个形体有如下的基础函数和解释:

1
2
virtual Bounds3f ObjectBound() const = 0;
virtual Bounds3f WorldBound() const;
阅读更多

PBR论文实现:Marschner's/d'Eon Hair Model

在完成GAMES101大作业的时候,选择了Marchner的毛发模型的实现,先后参考了两篇论文,总算是做出来像个东西了。

我阅读的第一篇论文是《Light Scattering from Human Hair Fibers》,这篇文章属于是现在的毛发渲染的开山鼻祖了。

这篇论文开创性地提出了毛发的表皮含芯的模型:

基本模型

作者认为人类的毛发不是单纯的一个柱状模型(Kajiya模型),而是表皮(cuticle)加上柱芯(cortex)的组合。同时,将毛发的不同颜色归因于柱芯对于不同波长光的吸收率不同,从而导致毛发出现不同的颜色。很重要的,这个模型将光线从单纯的反射(brdf)拓展为了多个不同的类别(bcsdf),其中Marschner的这篇论文着重强调了其中的三个组成项:R、TT、RTR,R代表一次反射(reflection),T代表一次在柱芯中的传播(transmission),这里我们也可以得到,R项是没有受到吸收的,所以R项应该是造成高光的项。

阅读更多

PBR读书笔记一:Geometry & Transformation

这会是一个持续更新的系列,用来记录我在阅读《Physically Based Rendering》的一些读书心得和brief。

四元数 Quaternions

之前玩Unity的时候就有过使用四元数的经历,当时还不太明白万向锁和四元数的本质,看了这一章之后遍会有更加深入的体会。

四元数发明的初衷是对于复数的拓展,\(q=(x,y,z,w)=w+x\vec i+y\vec j+z\vec k\),ijk四个量的乘法运算是非交换的。与此同时,\(q=(q_{xyz}, w)\),因此对两个四元数做点乘,两个分量:

\[(q\cdot q')_{xyz} = q_{xyz}\times q'_{xyz} + q_wq'_{xyz} + q'_wq_{xyz}\]

阅读更多