当前位置: 首页 > news >正文

Filament 实时渲染引擎介绍~~

作者:_子宽

来源:

https://blog.csdn.net/u010281174/article/details/107847966

摘要

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的支持,色彩后处理系统,其次是半成熟的光照系统。

作为渲染领域的学习材料还是不错的。


技术交流,欢迎加我微信:ezglumes ,拉你入技术交流群。

推荐阅读:

音视频面试基础题

OpenGL ES 学习资源分享

开通专辑 | 细数那些年写过的技术文章专辑

NDK 学习进阶免费视频来了

推荐几个堪称教科书级别的 Android 音视频入门项目

觉得不错,点个在看呗~

相关文章:

  • 码率直降70%,拍乐云发布国内首个 AV1 编码引擎 Venus,引领实时视频互动革新...
  • RecyclerView性能优化的最后一公里
  • 腾讯视频会议真实内部实现分享
  • Systrace 流畅性实战 1 :了解卡顿原理
  • 短视频中解决音视频混音出现杂音的问题
  • mmap可以让程序员解锁哪些骚操作?
  • 如何实现H.264的实时传输?
  • WebRTC 系列1--创建相机预览
  • 如何用研发效能搞垮一个团队
  • 揭秘版权保护下的视频隐形水印算法(下篇)
  • 浅谈音视频自动化测试
  • 拒绝卡顿,揭秘盒马鲜生 APP Android 短视频秒播优化方案
  • WebRTC 系列2--双摄像头同时预览
  • 如何实现 Android 短视频跨页面的流畅续播?
  • Android 开发的尽头就是 Linux 系统~
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Django 博客开发教程 16 - 统计文章阅读量
  • gitlab-ci配置详解(一)
  • JavaScript 奇技淫巧
  • java中的hashCode
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • vue-cli在webpack的配置文件探究
  • 对象引论
  • 关于 Cirru Editor 存储格式
  • 后端_ThinkPHP5
  • 微信小程序开发问题汇总
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 怎样选择前端框架
  • 主流的CSS水平和垂直居中技术大全
  • #### go map 底层结构 ####
  • #define与typedef区别
  • #Lua:Lua调用C++生成的DLL库
  • #QT(一种朴素的计算器实现方法)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (分布式缓存)Redis哨兵
  • .NET Remoting Basic(10)-创建不同宿主的客户端与服务器端
  • .net 按比例显示图片的缩略图
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d
  • [ 第一章] JavaScript 简史
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [ajaxupload] - 上传文件同时附件参数值
  • [Android Pro] android 混淆文件project.properties和proguard-project.txt
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [C#]C# winform部署yolov8目标检测的openvino模型
  • [codevs 2822] 爱在心中 【tarjan 算法】
  • [CUDA 学习笔记] CUDA kernel 的 grid_size 和 block_size 选择
  • [Deepin 15] 编译安装 MySQL-5.6.35
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件
  • [HNOI2008]玩具装箱toy
  • [HOW TO]如何在iPhone应用程序中发送邮件
  • [javaSE] 数据结构(二叉查找树-插入节点)
  • [JDK工具-2] javap 类文件解析工具-帮助理解class文件,了解Java编译器机制