```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 ```