摘要

Filament是一款Google开发的跨平台的实时渲染引擎,支持PBR材质,并且针对Android平台做了优化(毕竟Google亲儿子)。本文将针对Filament的特点,简单介绍Filament的一些特性,包括它的材质系统和光照系统。这些设计对于实现一款渲染器,特别是PBR渲染器具有一定的参考意义。至于具体的实现细节,因为跟PBR理论重合度比较高,就不再赘述。

如果对这款引擎很感兴趣,可以参考他们的文档。这个文档怎么说呢,详细的地方非常详细,简略的地方一律“TODO”过,很神奇。

平台特性

● 跨平台,支持Android,IOS,Linux,maxOS,Windows
● 提供C++,Java,JavaScript API
● 底层图形库支持OpenGL 4.1+,OpenGL ES 3.0+,Metal,Vulkan 1.0,WebGL 2.0

渲染特性

● 支持Clustered forward renderer
● 支持microfacet BRDF
● 支持HDR/linear 光照
● 支持各向异性材质
● 支持metallic,roughness,ao,normal mapping,texture mapping
● 支持布料渲染
● (弱)支持半透明材质
● 支持IBL
● 支持物理相机模拟(快门,光圈等)
● 支持shadows
● 支持全局雾模拟
● 支持色彩系统(color grading)
● 支持FXAA,MSAA
● 支持动态分辨率

材质系统

材质模型

Filament定义了以下几种材质模型:
● Lit(standard)
● Subsurface
● Cloth
● Unlit
其中,第一种也是用的最多的一种,在别的渲染器可能称为standard model/material。Cloth用于模拟布料。Unlit严格来说不算一种材质,可以理解为在屏幕上显示一些调试信息用的材质。

Lit model

Lit model是Filament支持最全面的也是最基础的材质模型,它是基于PBR模型的材质,包含以下几种属性:
● baseColor,表示non-metallic表面的漫反射albedo,或者metallic表面的高光颜色
● metallic,表示材质的金属性,0代表dielectric,1.0代表conductor

metallic从0(左)到1(右)。
● roughness,表示材质的粗糙度,1.0代表光滑,0代表粗糙

非金属的roughness从0(左)到1(右)。

金属的roughness从0(左)到1(右)。
● reflectance,表示Fresnel反射系数

reflectance从0(左)到1(右)。
● normal,表示材质表面的局部法向偏移
● ambientOcclusion,表示环境光照强度
● emissive,表示材质表面的发光程度
● anisotropy和anisotropyDirection,描述各向异性程度
● clearCoat,clearCoatRoughness和clearChatNormal,表示clear coat layer的参数
● bentNormal,用于提升间接光的效果
● postLightingColor,用于跟光照计算结果混合,描述特殊光照效果
● ior,表示物体的折射率

ior从1(左)到1.5(右)。
● transmission,表示物体的透明度

transmission从0(左)到1(右)。
● absorption,表示材质对不同透射光线的吸收系数

absorption从 (0.0, 0.02, 0.14) (左)到 (0.0, 0.36, 2.3) (右)
● microThickness和thickness,材质的厚度参数
其中,baseColor、metallic、roughness、reflectance、normal、ambientOcclusion、emissive都是PBR材质中常用的参数,用法也基本一致。
有些物体表面会覆盖一层薄薄的半透明材质,类似于手机表面的贴膜。但是这层薄膜也是有一定的颜色和朝向的,clear coat参数(clearCoat,clearCoatRoughness和clearChatNormal)就是用于描述这一层表面材质,默认它是各向同性、非金属的。其中clearCoat应当被视为布尔变量,描述的是是否存在此表面材质。

clearCoat从0(左)到1(右)。

clearCoatRoughness从0(左)到1(右)。
除此之外,有些物体表面是各向异性的,例如朝单一方向磨砂的金属。anisotropy参数可以用于描述这种材质。

anisotropy从0(左)到1(右)。

Subsurface model

TODO
这个模型文档里没有介绍,我也没有用过,因此这里先略过。后面慢慢看代码吧。

Cloth model

Cloth模型用于描述类似于纺织物的布料材质,这类布料的一个特点是其表面由纤维堆叠而成,会吸收和散射一定的入射光线。
Cloth model包含前面Lit model的各种参数,删除了metallic和reflectance,额外添加两个cloth相关的参数:
● sheenColor,描述高光反射的颜色

蓝色纤维有(右)与没有(左)sheenColor
● subsurfaceColor,描述次表面散射的颜色

白色布料(左)与带棕色subsurface scatting的白色布料(右)

Unlit model

如前所述,Unlit model不算是一个材质模型,它用于渲染天空盒,或场景中以外的物体,比如用户界面的图形和文字,或者用于调试。如下图所示。该模型只有三个参数:
● baseColor
● emissive
● postLightingColor
用法跟Lit model一致。

光照系统

Filament支持的光照可以分为直接光(direct lighting)和间接光(indirect lighting),前者包括:
● 方向光(directional lights)

● 精确光源(punctual lights),包括point lights和spot lights,二者的区别是point light是超各个方向均匀发光的,而spot light有一个朝向,朝向以外的区域光照强度逐渐减少,直至为零:


● Photometric lights,用配置文件描述光源发出的光线在各个方向上的强度,可以还原真实世界中的光源情况。这一套描述是通用的光源描述,Filament的用法是将描述文件处理为纹理,然后在渲染的时候取出来判断计算光照。我理解这个光源其实是对spot light的拓展。下图展示了一些不同的光源描述文件。

● 面光源(Area lights):仅支持正方形和圆形的面光源。
间接光包括:
● Image-based lighting

光照参数

对于直接光来说,Filament用以下参数来描述一个光源:
● Type,定义光源类型,包括directional,point,spot,area
● Direction,描述光线朝向,或者面光源的法向
● Color,描述光源发出的光线的颜色
● Intensity,描述光线强度
● Falloff radius,光源所能影响到的最大半径
● Inner angle和Outer angle,描述spot light的内外圆锥的角度
● Length和Radius,描述面光源的边长、半径
● Photometric profile,Masked profile和Photometric multiplier,描述puctual lights的属性

Imaging pipeline

Imaging pipeline用于对片元着色器输出的颜色做进一步处理,使其色彩更加真实。包含以下几个步骤:
● 白平衡
● 色彩分级
● 色调映射
● OETF(opto-electronic transfer function)
流程图如下:

Physically based camera

基于物理的相机可以设置相关的相机参数,对成像效果进行调整。应用到的相机参数包括光圈(aperture)、快门(shutter speed)、敏感度(ISO)。由于采用三个量表示曝光效果过于繁琐,因此Filament将其简化为exposure value,简称EV。

总结

总的来说,Filament是一款还在开发中的渲染器,主要特点是PBR材质系统,对Android的支持,色彩后处理系统,其次是半成熟的光照系统。作为渲染领域的学习材料还是不错的。

Filament介绍相关推荐

  1. Filament 实时渲染引擎介绍~~

    作者:_子宽 来源: https://blog.csdn.net/u010281174/article/details/107847966 摘要 Filament是一款Google开发的跨平台的实时渲 ...

  2. 【我的渲染技术进阶之旅】关于C++轻量级界面开发框架Dear ImGui介绍

    文章目录 一.怎么知道ImGui的 1.1 Filament中有使用ImGui 1.2 其他很多渲染框架都有使用ImGui 二.ImGui介绍 2.1 ImGui风格 2.2 Imgui介绍 2.2. ...

  3. 基于Filament引擎的Animoji效果实现

    Animoji是2017年9月13日苹果发布的新款手机iPhone X上的增强现实(AR)表情包.其使用面部识别传感器来检测用户面部表情变化,同时用麦克风记录声音,并最终生成可爱的3D动画表情符号.2 ...

  4. Google Filament引擎编译记录

    我之前写过两篇Filament编译文档,就在我的网站上,可以到如下地址找到: 捉不住的鼬鼠的训练场 - 文档 现在又在做安卓有关开发和编译的问题,尤其是涉及到C++原生代码编译so文件,然后安卓端引入 ...

  5. Google Filament 源码学习(一):Filament 编译

    目录 前言 一.环境说明 二.环境搭建 1. Visual Studio 2019 2. Git & Cmake & Python3.7 安装 3. 克隆 Filament 源代码 4 ...

  6. 深入浅出filament Android编译脚本

    依赖环境 安装Android Studio 4.0+ OpenJDK 1.8 (单独安装,或者复用Android Studio内置,/Applications/Android Studio 4.0 P ...

  7. Filament Android 编译搭建(基于Ubuntu环境)

    说明 To build Filament, you must first install the following tools: CMake 3.19 (or more recent) clang ...

  8. Google Filament 源码学习(二):Material System (一)

    目录 前言 Material System Introduction Standard Model (标准材质) Standard Model Standard Model Summary Impro ...

  9. Filament 渲染引擎剖析 之 FrameGraph 1 虚拟资源的定义与创建

    Filament 使用了可扩展渲染管线(FrameGraph)来组织渲染通道和管理渲染资源,网上也搜了下可扩展渲染管线的相关的文章,一般认为可扩展渲染管线是次时代渲染引擎应该具备的比较先进的管线组织架 ...

最新文章

  1. 用U盘安装VMware ESXi4
  2. 【 FPGA 】Xilinx设计约束(XDC)中时钟约束的表示方法
  3. Mac安装双系统-win10
  4. 信息收集渠道:文本分享类网站Paste Site
  5. linux关闭涉及安全的服务,Linux中关闭不必要服务减少漏洞
  6. javascript中常用数组函数
  7. RabbitMQ,RabbitMQ 的工作模式,Spring 整合 RabbitMQ,Springboot 整合RabbitMQ
  8. 工信部推动云计算健康快速发展 催生巨大市场机会
  9. C/C++unlink函数的使用
  10. DT CMS致力于Spring Boot2.3.5 Vue前后端分离的RBAC权限框架(盛世美颜!)
  11. dubbo常见的一些面试题
  12. powershell 模拟IE行为
  13. 艾孜尔江用JS/TS生成随机姓名
  14. 加拿大计算机工程研究生,加拿大维多利亚大学电子与计算机工程系副教授诚招硕士研究生 - 导师招生 - 小木虫 - 学术 科研 互动社区...
  15. GF1_WFV(高分一号宽幅)GF6_WFV(高分六号宽幅)GF4(高分四号)CB04(中巴04星)免费下载方式简介
  16. LoadBalancer整合springboot
  17. [唠嗑]我的阿里实习体验(写于实习入职第二天)
  18. DY(抖音)、KS(快手)、西瓜、知乎等批量去水印小程序版本可视化版本
  19. krnln.fnr和shell.fne_电脑开机显示failedtoloadkernllibrary什么意思啊
  20. 纳瓦尔宝典 健康、爱和使命,以此为序,其他的都不重要 不把自己太当回事

热门文章

  1. pandas 处理缺失值[dropna、drop、fillna]
  2. my.cnf的常规配置
  3. android 自定义长条进度条_Android 条形进度条
  4. opencv cvRound函数cvClone
  5. MIME类型,Content-Type
  6. 学习产品基础知识学习沟通-每日打卡
  7. 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列投到队列尾的元素个数(包含队列头、队列尾)。
  8. CNN-台大李宏毅学习笔记
  9. 家·谱——人脸识别家谱系统
  10. 打印、报表和文档-家谱树