Init
This commit is contained in:
186
07-Other/简历/压力面导图 .md
Normal file
186
07-Other/简历/压力面导图 .md
Normal file
@@ -0,0 +1,186 @@
|
||||
```markmap {scale=1.1}
|
||||
## 对于项目管理的了解
|
||||
### PSD通用格式
|
||||
灼华互娱
|
||||
主要使用ABC缓存结算头发与布料,但ABC缓存很可能因为过大而导致导入崩溃。所以灼华互娱对DCC的ABC导出插件进行魔改从而减少ABC缓存大小。但个人认为最佳的解决方案还是重新实现导出缓存格式,不过这需要实现DCC导出插件与Unreal4导入插件(引擎没有必要使用高精度数据),工作相对来说会大一些。
|
||||
|
||||
Niagara与Houdini结合
|
||||
|
||||
灼华互娱采用的方案是: 使用Niagara制作普通粒子特效。 对于需要解算巨量粒子则使用Houdini生成粒子缓存,导入Ue4中。在Ue4中生成模型Instance作为粒子。
|
||||
|
||||
#### 个人想法
|
||||
- 多版本美术资产浏览与比对功能。
|
||||
|
||||
### 聊聊自搭建服务器,以及Gitlab、Gitea
|
||||
- 小巧耗资源少,但功能有限。貌似邮件系统还有bug。
|
||||
|
||||
#### GitLFS与UE4
|
||||
- 二进制文件臃肿与git清理功能
|
||||
|
||||
#### GitHook与WebHook
|
||||
- GitHook:执行Git操作所会调用的钩子。
|
||||
- WebHook:是GitHook的一种,通过WebSocket通知其他软件与平台的钩子。
|
||||
|
||||
### 自动化集成系统
|
||||
- 多操作系统开发需要
|
||||
- 构建与发布产品(不同环境)
|
||||
- 构建DLL并且上传到哨兵程序中
|
||||
- 构建自定义引擎
|
||||
- 运行自动测试程序(UE4内置Session Frontend或者通过自动化集成系统直接与UE4自动测试框架进行交互)
|
||||
- 检测代码与分支的有效性
|
||||
- 为每个设置构建对应的版本
|
||||
|
||||
#### 好处
|
||||
- 减少不必要的加班时间
|
||||
- 可以及时发现bug(即使不写自动测试代码)
|
||||
|
||||
#### 相关的CL工具
|
||||
##### 因为是个人开发所以,仅仅是大致了解一下。
|
||||
- TeamCity
|
||||
- Jenkins
|
||||
- Bamboo
|
||||
|
||||
#### 为单位写个一个简单的全流程数据生产平台,功能为数据录入、展示、查询、以及打包成单机版程序
|
||||
|
||||
## 渲染知识
|
||||
- 我个人认为渲染的本质是:通过对场景与光源的采样,计算传递到摄像机与实际情况接近的光辐射量。
|
||||
|
||||
### 光谱
|
||||
- 光通常指的是人类眼睛可以见的电磁波(可见光),视知觉就是对于可见光的知觉。可见光只是电磁波谱上的某一段频谱,一般是定义为波长介于400至750奈(纳)米(nm)之间的电磁波。实际生活中,我们看到的光由很多不同强度和波长的光混合而成。
|
||||
- PBRT中会使用光谱值进行采样与计算,最后再将光谱值转化为RGB值输出。
|
||||
|
||||
### 采样
|
||||
根据场景不同,存在不同的采样方式。
|
||||
#### 采样器基本原理
|
||||
事先生成若干组采样点样本,之后进行乱序操作。在进行逐像素采样时,使用伪随机的方式选取随机序号的采样点组。
|
||||
#### 采样分布
|
||||
##### 分层采样
|
||||
对采样区域进行分割,各个子区域单独生成样本。
|
||||
|
||||
##### 低差异序列
|
||||
- Van der Corput:根据底数将指定长度的正整数序列转换为指定进制的数序列,之后以小数符号为分界线,将每个数左边翻转到右边去。
|
||||
- HAMMERSLEY 哈默斯利:使用底数为 样本序号/样本总数 的Van der Corput序列。
|
||||
- Halton 霍尔顿:使用底数为质数序列的Van der Corput序列。
|
||||
|
||||
#### 贴图采样
|
||||
- 双线性插值
|
||||
- ISOTROPIC TRIANGLE FILTER 各项同性三角形过滤 然无法生成高质量的结果,但速度比较快。该滤波器因为各项同性的关系不支持非正方形或非轴对称的范围。该滤波器的主要缺点是:在斜角度观察纹理时图像容易变模糊。因为不同的角度会导致采样率不一致。
|
||||
- ELLIPTICALLY WEIGHTED AVERAGE 椭圆权重均值
|
||||
|
||||
#### 抗锯齿
|
||||
- SSAA
|
||||
- MSAA
|
||||
- FXAA
|
||||
- TAA(使用了低差异序列作为采样点)
|
||||
|
||||
#### 采样偏差以及信号重建没看
|
||||
|
||||
### 材质
|
||||
- 材质分为金属(导体)、非金属(绝缘体)、半导体。
|
||||
|
||||
#### 反射模型概念:BRDF、BTDF、BSDF、BSSSDF
|
||||
|
||||
#### 菲尼尔
|
||||
- 近似函数Schlick(施利克)
|
||||
- 菲涅尔方程描述了光线接触到表面后反射与透射的比,它实际上Maxwell方程在光滑表面上的求解。 因为在现实环境中光的偏振现象较少,所以在PBRT假设光不偏振。
|
||||
- 一般情况下,计算计算机图形学中的常见操作都会忽略色散现象,以此极大地简化光线传输计算(色散:折射率随着光的波长而变化)。
|
||||
|
||||
#### 微表面模型
|
||||
与普通的着色模型的区别在于,普通的着色模型假设着色的区域是一个平滑的表面,表面的方向可以用一个单一的法线向量来定义来定义。
|
||||
通过统计学方式来模拟这种微观结构分布。假设物体表面由大量微观几何表面组成,且每个表面都是绝对光滑的。必须保证每个微表面都能反射。因此只能用一个概率分布函数来计算任意方向的微小表面在着色区域中存在的概率。
|
||||
|
||||
#### 漫反射模型
|
||||
- LAMBERTIAN漫反射(辐射度/π)
|
||||
- OREN–NAYAR(奥伦-纳亚尔)漫反射模型(基于微表面模型)
|
||||
|
||||
#### 半向量(位于入射法线与观察法线中间的向量)
|
||||
#### 微表面分布函数(法线分布函数)
|
||||
- 法线分布函数由粗糙度决定,主要影响高光
|
||||
- Beckmann–Spizzichino(贝克曼-斯皮兹奇诺)
|
||||
- Phong
|
||||
- GGX
|
||||
|
||||
#### 几何衰减因子(Shadowing和Masking)
|
||||
- Trowbridge–Reitz(特罗布里奇 瑞兹)
|
||||
|
||||
#### 金属微表面模型(BRDF)
|
||||
- TORRANCE–SPARROW(托伦斯-斯派若)
|
||||
- Cook-Torrance(托伦斯)
|
||||
- $$f(\omega_{o},\omega_{i})=\frac{D(\omega_{h})F(\omega_{o})G(\omega_{o},\omega_{i})}{4 cos\theta_o cos\theta_i}$$
|
||||
|
||||
#### 迪士尼PBR模型
|
||||
##### 漫反射
|
||||
- 用两个Fresnel项来增加入射角度低时反射的光线能量强度来模拟这种效果
|
||||
|
||||
float DisneyDiffuse(Vector3 In, Vector3 Out)
|
||||
{
|
||||
float oneMinusCosL = 1.0f - AbsCosTheta(In);
|
||||
float oneMinusCosLSqr = oneMinusCosL * oneMinusCosL;
|
||||
float oneMinusCosV = 1.0f - AbsCosTheta(Out);
|
||||
float oneMinusCosVSqr = oneMinusCosV * oneMinusCosV;
|
||||
|
||||
// Roughness是粗糙度,IDotH的意思会在下一篇讲Microfacet模型时提到
|
||||
float IDotH = Dot(In, Normalize(In + Out));
|
||||
float F_D90 = 0.5f + 2.0f * IDotH * IDotH * Roughness;
|
||||
|
||||
return INV_PI * (1.0f + (F_D90 - 1.0f) * oneMinusCosLSqr * oneMinusCosLSqr * oneMinusCosL) *
|
||||
(1.0f + (F_D90 - 1.0f) * oneMinusCosVSqr * oneMinusCosVSqr * oneMinusCosV);
|
||||
}
|
||||
|
||||
|
||||
#### FourierBSDF
|
||||
|
||||
#### 曲线拟合BSDF-使用真实测量值进行曲线拟合(FF15)
|
||||
|
||||
### 光线追踪框架
|
||||
#### 求交加速框架:BVH、KD树、SBVH
|
||||
- BVH:在一个轴上对两个图元进行分割。分割过程中通过公式计算最佳分割点(最佳的表面积与体积)步骤1、计算每个图元的边界信息并且存储在数组中2、使用指定的方法构建树3、优化树,使得树更加紧凑
|
||||
- KD树:经过空间分割的图元数。
|
||||
- SBVH:Nvidia改进过的BVH结构,先对图元进行空间分割,最后使用BVH方式分割。 https://www.nvidia.com/object/nvidia_research_pub_012.html
|
||||
|
||||
#### 蒙特卡洛方法与重要性采样(忘记了)
|
||||
- 逆推法、舍选法
|
||||
|
||||
#### 路径追踪
|
||||
##### 双向路径追踪
|
||||
|
||||
## UE4灯光相关
|
||||
### 物理灯光:使用现实世界的测量值作为标准进行灯光设置
|
||||
- 之前版本中Unreal4的灯光使用的是虚幻单位,这是的之前版本的灯光没有一个物理值的衡量标准。你很可能会因为后处理空间、曝光等因素影响而无法设置出正确的亮度值。例如:你已经将一个区域的效果调整的很自然,但是别的区域就会很奇怪(bloom、阴影、光照等效果互相不匹配)。 而前人已经积累了大量的摄影知识与经验,所以我们没有必要光靠感觉来设置灯光亮度与曝光度,而需要使用摄影标准来设置灯光,从而使得场景更加真实。
|
||||
- 大晴天 15~16
|
||||
- 多云 13
|
||||
- 晚上月光 -6~-2
|
||||
|
||||
### UE4的曝光问题
|
||||
- 因为UE4的渲染框架都是以EV100 为0设计的,所以需要将经验上使用的灯光强度从当前曝光值下转换到EV100 0,不然会出现若干bug,比如默认的天空盒。
|
||||
|
||||
### 流程
|
||||
#### 场景初始化
|
||||
- 禁用自动曝光
|
||||
- 禁用SSAO以及SSR
|
||||
- 保持默认Tone Mapping
|
||||
- 确认天光与方向光为默认数值。天光:亮度为1 方向光:亮度为3.141593(π)
|
||||
- 设置测试用球(与色卡) 使用亮度为3.141593(Pi)的方向光,此时灰球的亮度为0.5。(使用Color Picker、或者截图使用Photoshop查看)
|
||||
- 确定你的材质是物理正确的。BaseColor:太暗或者太亮 Metallic:应该为0或者1。(黑色或者白色Mask) Specular:应该为0~1范围的浮点数。不应该为颜色值。
|
||||
|
||||
#### 后续流程
|
||||
- 设置曝光相关属性。
|
||||
- 将所有灯光都是设置为Stationary类型。并开始设置方向光与其他主光源的基础属性(方向、亮度等)以及天光(与反弹次数)。
|
||||
- 设置LightMass属性,使用预览级对场景进行测试渲染。
|
||||
- 开启LightingOnly模式对光照进行检查。
|
||||
- 给场景中的带有反射属性的物体添加反射球并调整属性。(命令行全局的反射质量、与抗锯齿质量 )
|
||||
- 调整场景雾气
|
||||
- 后处理调色
|
||||
|
||||
#### 静态方案
|
||||
- lightMass(lightMap)
|
||||
- VolumeLightMap(二阶球谐与旧版)区别在于可以使用流加载以及手机使用
|
||||
|
||||
#### 动态方案
|
||||
- 级联阴影
|
||||
- 胶囊阴影
|
||||
- 接触阴影(后处理)
|
||||
- 距离场GI(废弃)
|
||||
- 距离场阴影与AO
|
||||
- 4.25屏幕空间GI
|
||||
```
|
173
07-Other/简历/图形学细节.md
Normal file
173
07-Other/简历/图形学细节.md
Normal file
@@ -0,0 +1,173 @@
|
||||
## RDG
|
||||
### FrameGraph
|
||||
首先需要了解Frame Graphe的设计思想,为了速成,看了知乎大佬 奔驰 的文章。但也因为速成,必然会在一些地方有所误解,还请见谅。这里说一下我的理解:Frame Graphe思想可以理解为一帧中执行逻辑的图,没有限定是渲染还是Gameplay逻辑,但不管怎么说其重点在于图。
|
||||
大致操作为将逻辑以最小功能为标准封装成单独的Pass,Pass与Pass之间是变量(或者可以理解为资源)的传递的关系,因此就可以把整个逻辑关系转换成一个Graphe。
|
||||
|
||||
UE4的RDG全名为Render Dependency Graph,感觉是为了能更好的管理资源的加载回收(尤其是RT),拯救一下显卡上珍贵的显存以及IO带宽。同时方便程序员理解代码,不会写出毛线团一样的代码。至于生成的图没有看过在哪,估计在4.25加在Insight调试系统里吧。
|
||||
### 大致流程
|
||||
|
||||
通过FRDGBuilder对象构建RDG渲染流程。之后塞入定义的RDG Uniform以及Shader后,运行这个流程。RT会使用外部的IPooledRenderTarget接口取得(比如各种GBuffer),当然也可以自己创建,之后绑定到RDG Uniform中的RenderTargets[0]数组中。最后根据是ComputShader还是PixelShader选择分发或是绘制即可。但源码里也没有RDG的PixelShader的代码(95%都是ComputeShader的),经过试验,RDG的PixelShader的使用方法还是和旧版的GloalShader比较像的。
|
||||
|
||||
既然说到这个,之前我也是看了虚幻开放日的技术分享,知道了两者的区别。
|
||||
### ComputeShader与PixelShader对比
|
||||
ComputeShader对于PixelShader的优势:
|
||||
1. PixelShader只能处理当前Shader,ComputeShader是任意位置可写。可以用于编写屏幕空间反射等需要将效果写入任意位置的效果。
|
||||
2. 可以更好地利用显卡的并线单元。
|
||||
3. 共享内存:举个例子模糊、等需要多次采样各个像素的算法,使用共享内存就可以减少采样次数与消耗。
|
||||
|
||||
PixelShader对于ComputeShader的优势
|
||||
1. PixelShader可以预加载贴图并且缓存UV,使得读取贴图的效率会非常高。而ComputeShader需要计算出UV,所以做不到这点。
|
||||
2. PixelShader支持FrameBuffer压缩,减少带宽压力。
|
||||
3. PixelShader支持更多的贴图格式。
|
||||
|
||||
ComputeShader还存在无法读取UAV,比如把RT转化成SRV后才能读取,问了EPIC的luoshuang,说是历史遗留问题,UE5会解决。
|
||||
|
||||
## 制作玉石效果
|
||||
使用寒霜的FastSSS方案,这里我下载了演讲的PPT。厚度贴图可以使用Substance Painter烘焙。算法是反转法线后使用AO算法,在像素对应的三维坐标球形区域内生成若干采样点,计算模型内部的点与总点数的比。之后就是直接套寒霜公式了。
|
||||
|
||||
## 光线追踪
|
||||
《Ray Tracing in One Weekend》只是尝个鲜,学习《Ray Tracing from the Ground Up》后,拥有了一个基础的Ray Tracing框架。然后就是PBRT了,相当不错的教科书。因为单线程渲染效率太低,所以使用了直接使用Inter的TBB库,但最后发现写的渲染器
|
||||
会出现样本混乱的情况的。同时因为没有写并行库的基础,所以之后的后面几章就没有去写代码了。如果有时间会去看《c++并发编程实战》的英文版来学习并行编程。
|
||||
### PBRT
|
||||
1. pbrt采用了FLOAT宏来调整浮点类型,不过我记得VS的设置就可以直接调整。并且手动实现了EFLoat类来消除浮点数在四则运算后积累的误差。
|
||||
2. pbrt采用c++11的线程编写,没使用任何并行库。
|
||||
3. 实现了一个场景描述文件格式,可以将dcc软件制作的场景导入渲染。
|
||||
|
||||
### 一束光线
|
||||
我们从眼睛中看到的图形可以理解为视觉细胞接收到场景中辐射与反射的光辐射信息的结果,光线追踪就是计算机通过模拟这一过程所发明出的算法。根据光的波长不同,将其排列成为光谱。但受限于人眼感光细胞,人眼无法看到所有颜色,对于可见光,人们建立了不同色域范围的色彩标准。常用的是rgb、sRGB等。
|
||||
|
||||
#### 光源
|
||||
PBRT为了将光谱值转换为RGB值,实现了SampledSpectrum(采样频谱)与RGBSpectrum(RPG频谱)类,这里我没看懂,好像是通过对3条曲线采样求积分得到3轴的比值。
|
||||
|
||||
#### 采样
|
||||
除非直视光源,不然人眼接收到的光全都是经过N次反射的,因为我们可以把人眼接收到的图像理解成一个N阶多项式方程。同时这也相当于将一个自然现象模拟问题转化为一个数学问题,可以用其他的数学工具来解决问题。但该方程无法直接求解,所以会使用蒙特卡洛方法求近似值。
|
||||
|
||||
#### 蒙特卡洛方法
|
||||
是一种以概率统计理论为基础的数值计算方法。它的核心思想就是使用随机数(或更常见的伪随机数)来解决一些复杂的计算问题。通过对大量抽样样本进行统计,计算出其分布规律。
|
||||
|
||||
概率密度函数 pdf 一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数。
|
||||
累积分布函数 cdf 是概率密度函数的积分,能完整描述一个实随机变量X的概率分布。
|
||||
|
||||
有关抽样:
|
||||
#### 逆转法
|
||||
|
||||
#### 舍选法
|
||||
某些函数,可能无法通过对其进行积分从而获得pdf,或者无法通过计算获得逆cdf。舍选法是一种无需进行以上任意一个步骤就能根据函数分布生成样本的技术。本质上它是一种投飞镖法,假设我们想从某个函数f(x)中抽取样本,但是我们有一个pdf p(x)满足f(x)< c p(x),假设我们知道如何从p中获取样本
|
||||
|
||||
这个过程反复选取一对随机变量(X,ξ),如果点(X,ξc p(X))是在f(X)下面,那么接受样本X。否则,它将被拒绝,并再次选取一个新的样本对。这个方法的效率取决于f(x)与cp(x)的接近程度,越相似收敛地越快。而且适用于任意维度的函数。
|
||||
|
||||
|
||||
#### 重要性采样
|
||||
选择一个与目标概率密度函数具有相同形状的分布函数进行抽样,来减少方差。形状越接近,收敛越快。在《Raytracing in weekend》中对方形面光源运行了重要性采样。
|
||||
|
||||
#### 分层采样
|
||||
对采样区域进行分割,各个子区域单独生成样本。
|
||||
|
||||
#### 低差异序列
|
||||
低差异序列可以非常高效的生成分布非常均匀的高质量样本集合,相比伪随机数极大的提高蒙特卡洛积分收敛的效率,并且它们的实现都不复杂。
|
||||
|
||||
- Van der Corput:根据底数将指定长度的正整数序列转换为指定进制的数序列,之后以小数符号为分界线,将每个数左边翻转到右边去。
|
||||
- HAMMERSLEY 哈默斯利:使用底数为 样本序号/样本总数 的Van der Corput序列。
|
||||
- Halton 霍尔顿:使用底数为质数序列的Van der Corput序列。
|
||||
|
||||
UE4中的TAA好像就是用的低差异序列生成的样本。
|
||||
|
||||
#### 使用均值样本会产生 混叠现象,也就是摩尔纹
|
||||
在信号处理以及相关领域中,走样(混叠)在对不同的信号进行采样时,导致得出的信号相同的现象。它也可以指信号从采样点重新信号导致的跟原始信号不匹配的瑕疵。它分为时间走样(比如数字音乐、以及在电影中看到车轮倒转等)和空间走样两种(摩尔纹)。这里我们不详细展开。
|
||||
|
||||
#### 采样器基本原理
|
||||
事先生成若干组采样点样本,之后进行乱序操作。在进行逐像素采样时,使用伪随机的方式选取随机序号的采样点组。
|
||||
|
||||
#### 抗锯齿
|
||||
因为场景的定义在三维空间中是连续的,而最终显示的像素则是一个离散的二维数组。所以判断一个点到底没有被某个像素覆盖的时候单纯是一个“有”或者“没有"问题,丢失了连续性的信息,导致锯齿。
|
||||
|
||||
SSAA:超采样抗锯齿,高分辨渲染,之后取平均值结果。
|
||||
MSAA:在光栅化阶段判断一个三角形是否被像素覆盖的时候会计算多个覆盖样本(Coverage sample),最后根据权重样本占比所在的片元进行着色,不兼容延迟渲染管线。
|
||||
FXAA:边缘检测抗锯齿,是一种后处理抗锯齿技术。
|
||||
TAA:时间抗锯齿,将采样放到时间轴上的抗锯齿技术。对一个像素使用抖动效果,之后再将所有的采样混合起来。他需要解决判断每帧中这个像素的移动位置。但在一些运动较大、或者帧数较低的情况会出现 重影的问题。
|
||||
|
||||
#### 贴图采样
|
||||
- 双线性插值
|
||||
- ISOTROPIC TRIANGLE FILTER 各项同性三角形过滤 然无法生成高质量的结果,但速度比较快。该滤波器因为各项同性的关系不支持非正方形或非轴对称的范围。该滤波器的主要缺点是:在斜角度观察纹理时图像容易变模糊。因为不同的角度会导致采样率不一致。
|
||||
- ELLIPTICALLY WEIGHTED AVERAGE 椭圆权重均值
|
||||
|
||||
#### 偏差分析与重采样
|
||||
没学过相关知识,无法继续。
|
||||
|
||||
#### 加速结构
|
||||
如果光线每次与物体交互都需要遍历所有三角形,那效率将会非常低,为了提高求交速度,我们可以在渲染前实现构建加速结构,常用的有:BVH、KD。
|
||||
|
||||
BVH:
|
||||
1. 计算每个图元的边界信息并且存储在数组中(图元号,包围盒以及中心点)
|
||||
2. 使用指定的方法构建树(中间对半切的方法、SAH:首先计算图元位置,将其分配到12个桶中,并且计算每个桶最大边界盒,再遍历每个桶边界盒的Min与Max坐标计算最佳切分点,通过 切分后两个边界盒的表面积/当前包围盒的表面积来计算求交效率)子图元中质心距离最大的轴向作为分割方向。
|
||||
|
||||
KD树:对3个轴的所有的切分方案进行尝试,最终计算出最优的空间分割方案。
|
||||
|
||||
KD树的分割(每个轴遍历所有分割方案)与BVH(SAH)分割(每个轴12次分割)更加精确,BVH保证每个图元只有一次引用,内存占用较少,构建较为简单,而KD树并不保证,所以内存占用较多。因此KD树的求交效率要比BVH好,也导致了渲染时需要花费比BVH更多的时间在构建KD树上。 同时KD树在求交时会计算与光线与分割面的相交位置是否在[min,max]中来判断是否需要与茎节点中的两个节点一一求交,以此来减少求交计算量。而BVH通过深度优先遍历树进行求交的。 总结:BVH是基于物体分割的,KD数是基于空间分割的。
|
||||
|
||||
早几年NVIDIA研发出将两者结合的方案SBVH。这种算法可以节约因为图元分布(大小)不均匀而造成的BVH树求交效率低下。
|
||||
1. 找到一个对象分割候选者:使用SAH算法构建一个BVH。
|
||||
2. 找到一个空间分割候选者:类似构建KD树算法。
|
||||
3. 选择获胜者:基于SAH,选择消耗最小的作为最后结果。如果不满足叶子节点生成条件则继续分割。
|
||||
|
||||
我记得是前几次进行空间分割,后续使用对象分割。
|
||||
|
||||
### 材质模型
|
||||
接下来就是处理光线与物体交互的结果了。PBRT把材质分开金属、非金属、与半导体,其中半导体较为复杂,Pbrt里没有介绍。
|
||||
|
||||
根据材质性质不同,可以分为一下表面分布函数:
|
||||
BRDF双向反射分布函数:在单位微表面上反射辐亮度与入射辐射照度的比值。
|
||||
BTDF双向透射分布函数:在单位微表面上折射辐亮度与入射辐射照度的比值。
|
||||
与两者结合的BSDF,对于半透明材质则使用BSSSDF双向表面散射分布函数。
|
||||
|
||||
#### 微表面模型
|
||||
本来对于一个不确定表面可能需要使用采样要求积分,因为物体的微观表面参差不齐,无法通过分析的方法精准模拟。但微表面模型假定物体由大量微小的绝对光滑表面组成,之后就可以根据统计学计算出模拟出看上去正确的结果。
|
||||
现在用得较多的Burley模型(迪士尼模型),也是UE4使用的,就是基于这个微表面模型。
|
||||
|
||||
#### BRDF公式
|
||||
对于各项同性的BRDF公式就是: 漫反射 +(菲尼尔函数 * 法线分布项 D * 几何项G)/(4 cos入射角 * cos出射角)
|
||||
Cook-Torrance
|
||||
|
||||
##### 菲尼尔
|
||||
- 一般都会使用近似近似函数Schlick(施利克)
|
||||
- 菲涅尔方程描述了光线接触到表面后反射与透射的比,它实际上Maxwell方程在光滑表面上的求解。 因为在现实环境中光的偏振现象较少,所以在PBRT假设光不偏振。
|
||||
- 一般情况下,计算计算机图形学中的常见操作都会忽略色散现象,以此极大地简化光线传输计算(色散:折射率随着光的波长而变化)。
|
||||
|
||||
##### 微表面法线分布函数 (法线分布项 D)
|
||||
- 法线分布函数由粗糙度决定,主要影响高光
|
||||
- Beckmann–Spizzichino(贝克曼-斯皮兹奇诺)
|
||||
- Phong
|
||||
- Trowbridge–Reitz(特罗布里奇 瑞兹)ggx
|
||||
- 迪士尼改进了 Trowbridge–Reitz ,将其命名为GTR。
|
||||
|
||||
##### 几何衰减因子(Shadowing和Masking)几何项G
|
||||
- Smith阴影函数
|
||||
- 迪士尼对Smith 改造,smith-ggx
|
||||
|
||||
##### 漫反射
|
||||
- pbrt中使用 OREN–NAYAR(奥伦-纳亚尔)漫反射模型(基于微表面模型)
|
||||
|
||||
在《Raytracing in weekend》中,会使用LAMBERTIAN漫反射 (辐射度/π) 作为漫反射项,即不论任何角度,都会反射出一样的辐射度。
|
||||
Lambert漫反射模型在边缘上通常太暗,Disney开发了一种用于漫反射的新的经验模型,以在光滑表面的漫反射菲涅尔阴影和粗糙表面之间进行平滑过渡。思路是使用了2个Schlick Fresnel近似相乘作为调节因子
|
||||
|
||||
##### 测量BRDF
|
||||
pbrt中还介绍了一种通过测量来拟合brdf的方法,ff15中用到这种方法。
|
||||
|
||||
##### BTDF
|
||||
没看过,应该乘以 菲尼尔来计算的
|
||||
|
||||
##### BSSDF
|
||||
没看过,UE4好像通过生成均值采样点,之后再通过距离进行近似计算的
|
||||
|
||||
##### 迪士尼模型
|
||||
根据透明度参数,对透明渲染结果与绝缘体渲染结果混合,之后再根据金属度与金属渲染结果混合。
|
||||
|
||||
### 路径追踪
|
||||
从摄像机发射采样光线,最后把这条光线若干次反射过程中结果累加起来。
|
||||
|
||||
### 优化
|
||||
#### 光子映射
|
||||
通过让光源发射光子,来生成光子贴图,这样就能让收敛速度变快。
|
||||
|
||||
#### 双向路径追踪追踪
|
||||
同时从光源与摄像机发射采样光线,一起构建光路。之后将各个反射点直接连接起来,这样就能快速构建多条光路了。大大加快收敛速度。当然这些光路需要进行可见性测试。
|
84
07-Other/简历/成果.md
Normal file
84
07-Other/简历/成果.md
Normal file
@@ -0,0 +1,84 @@
|
||||
```markmap {scale=1.1}
|
||||
## 美术流程
|
||||
### Ue4中的场景物体融合方式与优化
|
||||
1. World aligned texturing 世界坐标映射贴图
|
||||
2. Pixel depth offset 像素深度偏移
|
||||
3. Distance field mesh blending 距离场模型融合
|
||||
4. Runtime virtual texturing 实时虚拟贴图
|
||||
|
||||
### Layered Material
|
||||
1. 尝试外包一个角色,并让外包以Material Mask的方式使用Substance Painter完成贴图。最后走完EPIC的Layered Material流程。
|
||||
|
||||
### UE4头发方案研究
|
||||
1. 学习Ornatrix for Maya插件,并且尝试制作头发。
|
||||
2. 学习Ornatrix制作面片头发方案,并且制作出成品。
|
||||
3. 走通UE4 Niagara Hair流程。
|
||||
|
||||
### UE4物理灯光流程
|
||||
1. 如何使用物理灯光系统
|
||||
2. 流程包括:初始化场景(关闭若干后处理效果,并且固定曝光)=》场景检查(贴图饱和度与亮度)=》按照当前环境对应的现实状况设置曝光度与天光HDRI(因为每个HDRI的亮度范围不一样,还可以在环境球材质中调整)=》主要自然光源完成后,烘焙二阶球谐GI=》按照场景发光物体进行布光=》烘焙阴影并检查是否有错误阴影=》逐个开启后处理效果并检查(反射=》AO)=》
|
||||
3. 了解UE4静态光照与动态光照所有相关的功能与用法。
|
||||
|
||||
### 动画蓝图
|
||||
1. 学习物理模拟动画节点
|
||||
2. 学习AdvancedLocomotionV3/V4 项目,以此对UE4动画系统有了一定了解。(FootIk、8方向运动、状态切换逻辑)
|
||||
3. 为了复现AdvancedLocomotionV4项目中动画的动画曲线(这些曲线会控制状态机以及其他融合动画效果),使用AnimModifier编写生成逻辑,最终复现了Run、Walk等移动动画的曲线。
|
||||
4. 学习动画蓝图的动态加载功能,解决当动画蓝图逻辑较多时的性能问题。对于每个武器拥有不同攻击动画与逻辑的情况,有很大的作用。
|
||||
|
||||
### UE4FaceARSample Iphone面部方案学习
|
||||
|
||||
## 程序
|
||||
### GameplayAbilitySystem GAS
|
||||
1. 学习GAS系统,了解Ability、Effect、AttributeSet、Tasks等类。
|
||||
1. 完全学习ActionRPG项目,并且将物品系统封装成组件,放在插件中以备后续使用。
|
||||
2. 解决只使用一个Ability类实现一套连招技能。
|
||||
3. 学习GameplayAbilitySystem中配套的Debug方法
|
||||
|
||||
### 编写Slate控件
|
||||
1. 实现整数版本的SpinBox
|
||||
2. 实现类似血源诅咒那种带有虚血的进度条
|
||||
3. 实现通过函数调用C++、蓝图通用的MessageBox,顺便了解了UMG、Slate、GameViewportClient之间的大致关系
|
||||
|
||||
### DCC插件
|
||||
1. 调用Maya的HumanIK插件实现骨骼批量重定向功能,将Max的Bip骨骼转换成Ue4骨骼。后续可以再加入其它定制功能。
|
||||
2. 实现在选中父骨骼后批量生指向若干选中顶点的之骨骼,并且生成蒙皮权重。大致作用是将低模角色的BlenderShape权重传递到高精度角色上。
|
||||
|
||||
### 项目管理
|
||||
1. 和他人合作Demo时,在租用的VPS上,搭建Gitea以实现版本管理(包括二进制文件)。
|
||||
2. 学习UE4的自动测试框架。
|
||||
|
||||
## 图形学效果
|
||||
### 渲染框架
|
||||
1. 通过学习EPIC的PPT以及源代码,最后撰写全网第一份RenderDependencyGraph(RDG)的使用教程以及HelloWorld案例。(案例已更新至4.26版本)
|
||||
2. 通过学习源代码,了解4.25版本传统渲染框架GlobalShader的变动,并撰写文章。
|
||||
|
||||
### Shader
|
||||
1. UE4后处理材质:各种卷积描边、各种模糊等。
|
||||
2. 在Ue4中实现对二次元模型进行透视校正,让模型更加二次元,顺便学习了BasePass中的顶点数据处理过程。
|
||||
3. 使用Gerstner波制作海洋效果,水体透射使用(水面深度-水底深度)来得到深度值,之后对使用2种颜色差值进行得到最后颜色,白沫使用基于Saturate高度的方法。后面如果再做,打算使用houdini通过粒子模拟的方式来生成白沫贴图。
|
||||
4. 学习EPIC TA的RayMarching 溶球效果,(使用了SDF)。
|
||||
5. 学习EPIC TA的RayMarching 2D 3D云效果。
|
||||
6. 修改ShaderModel以实现卡通渲染材质。
|
||||
|
||||
### 自定义图元类
|
||||
1. 在不修改管线的情况下,以插件的方式实现物体外描边效果
|
||||
2. 在不修改管线的情况下,以插件的方式实现UE4剖面效果
|
||||
|
||||
### 离线渲染学习
|
||||
1. 学习完《An Introduction to Ray Tracing》 系列3本书,并且渲染出对应效果的图片。
|
||||
2. 学习《Ray Tracing from the Ground Up》,并且使用Qt重新实现一遍离线渲染器(单核渲染)。
|
||||
3. 学习《pbrt》至第10章,后续因为没有多线程库编写能力,只能大致看了看。
|
||||
|
||||
## 其他效果
|
||||
### 面试J3时的面试题
|
||||
1. 看gif图实现枪支表面的能量效果,使用一张Noise贴图,分别使用平移与旋转,2种移动UV方式,叠加到一起。2种移动方式的贴图各自乘以了不同的颜色。
|
||||
2. 在不是用UE4 SSS ShaderModel情况下,使用寒霜的FastSSS方案,实现了玉石枪支的效果。因为家里电脑性能以及面试周期问题,没有通过添加ShaderModel的方式来修改,所以能量不够守恒。
|
||||
3. 使用Python为Maya编写一个生成圆柱体的插件,点、面、法线都是手动计算的,可以任意设置大小、横纵以及圆弧段数,UV采用Maya内置的映射命令。 使用Qt编写了插件界面。
|
||||
4. 实现了一个在屏幕空间宽度恒定的“赛博朋克”风格网格材质,通过使用了透视矩阵 对宽度进行校正来实现。
|
||||
5. 在不改变模型拓扑结构或者动态改变模型结构的情况下,设计一种基于Vertex Program的算法,动态改变毒圈模型的顶点位置。使得玩家走近毒圈边缘时,看到尽可能平滑的弧线。——最后因为时间不够,只实现了核心逻辑:使用一个没有封口的圆柱体,输入2个角度,让圆柱体像扇子那样按照角度进行折叠,也就是将顶点挤压到一起。最后只差通过摄像机方向、位置、fov、圆心位置计算2个角度以及威风口处的旋转位置(将威风口藏在摄像机背后)。
|
||||
|
||||
## 代码
|
||||
1. GAS
|
||||
2. 网络联机
|
||||
3.
|
||||
```
|
52
07-Other/简历/技能.md
Normal file
52
07-Other/简历/技能.md
Normal file
@@ -0,0 +1,52 @@
|
||||
|
||||
|
||||
## UE4
|
||||
|
||||
使用Custom节点实现后处理效果 (https://www.cnblogs.com/blueroses/p/6361517.html、
|
||||
https://www.cnblogs.com/blueroses/p/6511751.html)
|
||||
学习Ryan Brucks的溶球视频教程(https://www.cnblogs.com/blueroses/p/6391995.html)
|
||||
学习Ue4的GlobalShader与Computer写法(https://zhuanlan.zhihu.com/p/66514192、
|
||||
https://zhuanlan.zhihu.com/p/66841824)
|
||||
在不修改源代码的情况下实现多Pass效果(https://zhuanlan.zhihu.com/p/69139579、
|
||||
https://zhuanlan.zhihu.com/p/69156465)
|
||||
学习GameplayAbility系统、ActionRPG项目(https://zhuanlan.zhihu.com/p/76395757、
|
||||
https://zhuanlan.zhihu.com/p/75987858等)
|
||||
学习UE4的灯光流程(https://zhuanlan.zhihu.com/p/89270442、https://zhuanlan.zhihu.com/p/92456949等)
|
||||
探索UE4头发制作方法(https://zhuanlan.zhihu.com/p/98751524、https://zhuanlan.zhihu.com/p/99345059)
|
||||
|
||||
Ue4动画系统学习(https://zhuanlan.zhihu.com/
|
||||
|
||||
### Slate
|
||||
扩展Slate的进度条以实现血源诅咒中的虚血效果。
|
||||
|
||||
### 渲染
|
||||
|
||||
Shader
|
||||
|
||||
灯光流程
|
||||
|
||||
渲染框架
|
||||
|
||||
### 动画系统
|
||||
|
||||
### 编程
|
||||
GAS
|
||||
|
||||
## 其他语言与框架
|
||||
Qt、Python、JavaScript、VUE全家桶、Node.js。
|
||||
|
||||
## DCC
|
||||
1. 对Maya比较熟悉,编写过2个Maya插件,分为调用HumanIK对动作文件进行批量重定向、批量生成指向选中顶点的骨骼并赋予蒙皮(用于表情)。
|
||||
2. 目前正在学习Houdini。
|
||||
|
||||
## 能力佐证
|
||||
- 知乎:https://www.zhihu.com/people/blueroseslol/
|
||||
- Github: https://github.com/blueroseslol
|
||||
- Blog:http://blueroses.top
|
||||
- Blog(已废弃):https://www.cnblogs.com/blueroses
|
||||
|
||||
## 工作经历
|
||||
国家锁具产品质量监督检验中心 2013年07月~至今
|
||||
- 使用Node.js为公司编写内网数据管理系统,具有数据汇总、展示、打包单机版等功能。
|
||||
- 使用Electron为公司编写数据查询软件。
|
||||
- 使用Qt为公司编写其他工具产品。
|
Reference in New Issue
Block a user