目录

  • Introduction
  • Filament 工程简化
    • 删除 Filament 工程中非核心内容
      • 根目录保留
      • build文件夹中保留
      • filament文件夹中保留
      • libs文件夹中保留
      • third_party文件夹中保留
      • tools文件夹中保留
    • 关于CmakeList中的修改
      • 根目录下CmakeList 修改
    • 删除所有保留库的test文件
    • 小结
  • 材质框架分离
    • Compiling materials
      • Compiling
      • Shader validation
      • Flags
    • Filament 材质包的编译
      • matc
      • resgen
    • Matc 工程分离
    • Resgen 工程分离
  • 总结

Introduction

   本节是 Filament 材质框架阅读的部分。之前的小节由于有官方文档,因此,笔记不会存在明显的错误。但在本节之后,都是自己对Filament的理解,可能在理解和总结上有严重的错误。因此,需要经常回来调整内容。

Filament 工程简化

   从 GitHub 克隆下来的工程包含很多官方的示例。看起来比较臃肿。个人认为学习某个开源项目第一步是把该项目的核心内容分离出来。

删除 Filament 工程中非核心内容

  • 注意

    • 本节包含的,包括以后对 Filament 框架的调整只适用于Window系统,其他系统处理方式大部分相同,只是某些平台相关的部分处理不同。

根目录保留

1. build
2. filament
3. libs
4. shaders
5. third_party
6. tools
7. CMakeLists.txt

build文件夹中保留

1. windows
2. licenses.inc.in

filament文件夹中保留

1. backend
2. include
3. src
4. CMakeLists.txt

libs文件夹中保留

1. bluegl/bluevk
2. filamat
3. filameshio
4. filabridge
5. filaflat
6. geometry
7. ibl
8. imageio
9. image
10. math
11. utils

third_party文件夹中保留

1. astcenc
2. etc2comp
3. getopt
4. glslang
5. libpng
6. libz
7. libassimp
8. meshoptimizer
9. robin-map
10. spirv-cross
11. spirv-tools
12. smol-v
13. stb
14. tinyexr
15. vkmemalloc

tools文件夹中保留

1. cmgen
2. filamesh
3. glslminifier
4. matc
5. mipgen
6. resgen

关于CmakeList中的修改

  • Cmake 我也只是懂些基础而已,对编写构建脚本不熟,所以修改也是缝缝补补,不严谨 !

根目录下CmakeList 修改

  • 删除(可搜索关键字 “IS_HOST_PLATFORM” )

          add_subdirectory(${FILAMENT}/java/filamat)add_subdirectory(${FILAMENT}/java/filament)add_subdirectory(${FILAMENT}/java/gltfio)
    
  • IS_HOST_PLATFORM 保留以下内容,其余都删除

     1.  add_subdirectory(${LIBRARIES}/bluegl)2.  add_subdirectory(${LIBRARIES}/imageio)3.  add_subdirectory(${EXTERNAL}/astcenc/tnt)4.  add_subdirectory(${EXTERNAL}/etc2comp) 5.  add_subdirectory(${EXTERNAL}/libassimp/tnt)6.  add_subdirectory(${EXTERNAL}/libpng/tnt)7.  add_subdirectory(${EXTERNAL}/libz/tnt)8.  add_subdirectory(${EXTERNAL}/tinyexr/tnt)9.  add_subdirectory(${TOOLS}/cmgen)10. add_subdirectory(${TOOLS}/filamesh)11. add_subdirectory(${TOOLS}/glslminifier)  12. add_subdirectory(${TOOLS}/matc)13. add_subdirectory(${TOOLS}/mipgen)14. add_subdirectory(${TOOLS}/resgen)
    
  • Common to all platforms 以下内容,其余都删除

        1.  add_subdirectory(${LIBRARIES}/filabridge)2.  add_subdirectory(${LIBRARIES}/filaflat)3.  add_subdirectory(${LIBRARIES}/filameshio)4.  add_subdirectory(${LIBRARIES}/geometry)5.  add_subdirectory(${LIBRARIES}/ibl)6.  add_subdirectory(${LIBRARIES}/image)7.  add_subdirectory(${LIBRARIES}/math)8.  add_subdirectory(${LIBRARIES}/utils)9.  add_subdirectory(${FILAMENT}/filament)10. add_subdirectory(${FILAMENT}/shaders) 11. add_subdirectory(${EXTERNAL}/robin-map/tnt)12. add_subdirectory(${EXTERNAL}/smol-v/tnt)13. add_subdirectory(${EXTERNAL}/meshoptimizer)14. add_subdirectory(${EXTERNAL}/stb/tnt)15. add_subdirectory(${EXTERNAL}/getopt)
    
  • FILAMENT_BUILD_FILAMAT 删除 the material debugger

删除所有保留库的test文件

  • 经过上述处理之后,保留下来的代码中还是有很多测试用到的代码,需要删除。内容有

    1. CmakeList中标识test的代码
    2. filament CmakeList 中 add_subdirectory(test) 和 add_subdirectory(benchmark) 保留backend
    3. libs/math 中 benchmarks 包括CmakeList中信息
    4. libs/utils中 benchmarks 包括CmakeList中信息
    5. third_party 暂时不清理
    

小结

   经过上述处理,再重新编译工程即可。如果编译过程中遇到错误,根据提示修改即可。(反正我自己已经验证过N次了,应该没问题#109)

材质框架分离

   可能是跟自己的性格相关。拿到一个不熟悉的项目代码,第一件事就是拆!

Compiling materials

   首先要了解材质编译的方式(先学会用再拆分)

  • 资料来源于官方文档:https://github.com/google/filament/tree/main/docs/Materials.html

Compiling

  • 材质包 (Material packages) 是根据我们定义的 *.mat 文件和 Filament 根目录中 shaders/src 文件夹里 GLSL 相关文本使用 matc.exe 组装成的。材质包是后缀为.filamat的文件
  • 使用命令行生成材质包示例如下
    • $ matc -o ./materials/bin/car_paint.filamat ./materials/src/car_paint.mat

Shader validation

  • matc 在编译材质包的时候会对 shaders 的验证。编译错误会在命令行中进行提示。

Flags

  • -o, --output

    • Value

      • [path]
    • Usage
      • 输出文件的路径
  • -p,–platform
    • Value

      • desktop/mobile/all
    • Usage
      • 指定输出 platform
  • -a,–api
    • Value

      • opengl/vulkan/all
    • Usage
      • 指定目标图形API
  • -S, --optimize-size
    • Value

      • N/A
    • Usage
      • 在优化性能的同时,优化编译材质的大小
  • -r, --reflect
    • Value

      • parameters
    • Usage
      • 将指定的元数据以JSON格式输出
  • -v, --variant-filter
    • Value

      • [variant]
    • Usage
      • 筛选出指定的逗号分分隔的 variant
  • matc 提供了一些与应用程序开发人员无关且仅供内部使用的其他 flags

Filament 材质包的编译

matc

  • 材质包是在我们编译工程时,利用Cmake进行编译的。脚本在根目录下的filament文件夹中 CMakeLists.txt 文件中。

    • 250行开始为编译材质包的代码,如下

      //MATERIAL_SRCS为mat的相对路径 (src/materials/fsr/fsr_easu.mat)
      //MATERIAL_DIR为输出的路径
      //MATC_BASE_FLAGS为ROOT/CMakeLists.txt中的内容, 搜索Material compilation flags
      //命令实例(windows opengl) -a opengl -p desktop -gd
      foreach (mat_src ${MATERIAL_SRCS})//获取文件名get_filename_component(localname "${mat_src}" NAME_WE)//获取文件的绝对路径get_filename_component(fullname "${mat_src}" ABSOLUTE)set(output_path "${MATERIAL_DIR}/${localname}.filamat")//执行mat->filamat打包add_custom_command(OUTPUT ${output_path}COMMAND matc ${MATC_BASE_FLAGS} -o ${output_path} ${fullname}MAIN_DEPENDENCY ${fullname}DEPENDS matcCOMMENT "Compiling material ${mat_src} to ${output_path}")list(APPEND MATERIAL_BINS ${output_path})
      endforeach()
      mmhard
      
  • 测试
    • 可以尝试使用命令行编译材质包
    • matc.exe路径
      • E:\FDMPlayer_Test\clear_filament\soar_vk\tools\matc\Release
    • mat文件路径
      • E:\FDMPlayer_Test\clear_filament\filament\src\materials
    • 命令
      • matc.exe -a opengl -p desktop -gd -o test.filamat F:\vsmMipmap.mat

resgen

  • 生成 Filament 使用的 .h 和 .c 文件是使用 resgen.exe。这部分教程没有详细说明,这里简单总结一下
  • resgen.exe 路径
    • E:\FDMPlayer_Test\clear_filament\soar_vk\tools\resgen\Release
    • 参数在根目录下CMakeLists.txt文件内 # Common Functions 中
  • 使用命令
    • resgen.exe -qcx -p test F:\test.filamat
  • resgen 的作用是将材质包转化成十六进制的字符数组,程序可以直接读取这些字符来编译shader。

Matc 工程分离

  • 分离成 “Matc 代码 + lib” 形式
  • 工程结构
    • include : Filament 内部库头文件文件夹
    • lib:Filament 内部库lib文件夹
    • matc: matc 源代码文件夹
    • main.h:主函数
    • 3rd: Filament使用的第三方库文件夹
      • include:第三方库有文件
      • lib: 第三方库lib
  • 首先编译好简化后的Filament工程生成相关库的lib文件
  • 工程配置 (IDE VS2022)(Release 版本)
    • 第三方库引入

      • getopt

        • 头文件

          • G:\clear_filament\third_party\getopt\include

            • getopt文件夹复制到
            • 3rd/include 中
        • lib
          • G:\clear_filament\soar\third_party\getopt\Release

            • getopt.lib复制到
            • 3rd/lib 中
      • glslang
        • 头文件

          • G:\clear_filament\third_party\

            • glslang文件夹复制到
            • 3rd/include/中
        • lib
          • G:\clear_filament\soar\third_party\glslang\tnt\glslang\Release

            • glslang.lib复制到
            • 3rd/lib 中
          • G:\clear_filament\soar\third_party\glslang\tnt\glslang\OSDependent\Windows\Release
            • OSDependent.lib复制到
            • 3rd/lib 中
          • G:\clear_filament\soar\third_party\glslang\tnt\OGLCompilersDLL\Release
            • OGLCompiler.lib复制到
            • 3rd/lib 中
          • G:\clear_filament\soar\third_party\glslang\tnt\SPIRV\Release
            • SPIRV.lib 和 SPVRemapper.lib复制到
            • 3rd/lib 中
      • robin-map
        • 头文件

          • G:\clear_filament\third_party\robin-map

            • robin-map文件夹复制到
            • 3rd/include 中
      • smol-v
        • 头文件

          • G:\clear_filament\third_party\smol-v\source

            • smolv.h 复制到
            • 3rd/include 中
        • lib
          • G:\clear_filament\soar\third_party\smol-v\tnt\Release

            • smol-v.lib 复制到
            • 3rd/lib 中
      • spirv-cross
        • 头文件

          • G:\clear_filament\third_party\spirv-cross\include

            • spirv_cross文件夹复制到
            • 3rd/include 中
        • lib
          • G:\clear_filament\soar\third_party\spirv-cross\tnt\Release

            • spirv-cross-core.lib、spirv-cross-glsl.lib、spirv-cross-msl.lib复制到
            • 3rd/lib 中
      • spirv-tools
        • 头文件

          • G:\clear_filament\third_party\spirv-tools\include

            • spirv-tools文件夹复制到
            • 3rd/include 中
        • lib
          • G:\clear_filament\soar\third_party\spirv-tools\source\Release

            • SPIRV-Tools.lib 复制到
            • 3rd/lib 中
          • E:\filament\soar_vk\third_party\spirv-tools\source\opt\Release
            • SPIRV-Tools-opt.lib 复制到
            • 3rd/lib 中
    • 内部库引用
      • filamat

        • 头文件

          • G:\clear_filament\libs\filamat\include

            • filamat文件夹复制到
            • include 中
        • lib
          • G:\clear_filament\soar\libs\filamat\Release

            • filamat.lib 复制到
            • lib 中
      • utils

        • 头文件

          • G:\clear_filament\libs\utils\include

            • utils文件夹复制到
            • include 中
        • lib
          • G:\clear_filament\soar\libs\utils\Release

            • utils.lib 复制到
            • lib 中
      • filabridge

        • 头文件

          • G:\clear_filament\libs\filabridge\include

            • filament 和 private 文件夹复制到
            • include 中
        • lib
          • G:\clear_filament\soar\libs\filabridge\Release

            • filabridge.lib 复制到
            • lib 中
      • shaders

        • 头文件

          • G:\clear_filament\soar\shaders\generated

            • shaders.h复制到
            • include 中
        • lib
          • G:\clear_filament\soar\shaders\Release

            • shaders.lib 复制到
            • lib 中
      • filament

        • 头文件

          • G:\clear_filament\filament\backend\include

            • backend 和 private 文件夹复制到
            • include 中
      • math

        • 头文件

          • G:\clear_filament\libs\math\include

            • math 文件夹复制到
            • include 中
      • sca

        • 头文件

          • E:\filament\libs\filamat\src\sca

            • builtinResource.h 复制到
            • include/sca 中
      • licenses

        • 头文件

          • E:\filament\soar_vk\tools\matc\generated\licenses

            • licenses.inc 复制到
            • include/licenses 中
    • Matc 代码引入
      • G:\clear_filament\tools\matc\src
      • matc 和 main.h复制到工程根目录
    • VS配置
      • lib

        filamat.lib
        getopt.lib
        utils.lib
        filabridge.lib
        smol-v.lib
        SPIRV.lib
        glslang.lib
        shaders.lib
        OSDependent.lib
        Shlwapi.lib
        spirv-cross-core.lib
        spirv-cross-glsl.lib
        spirv-cross-msl.lib
        SPIRV-Tools-opt.lib
        SPVRemapper.lib
        OGLCompiler.lib
        SPIRV-Tools.lib
        
      • 附加包含目录

        • E:\matc_project\demo\include
        • E:\matc_project\demo\3rd\include
        • E:\matc_project\demo\3rd\include\glslang
        • E:\matc_project\demo\3rd\include\glslang\glslang\Include
        • E:\matc_project\demo\3rd\include\glslang\SPIRV
        • E:\matc_project\demo\3rd\include\glslang\glslang\Public
        • E:\matc_project\demo\3rd\include\glslang\glslang\MachineIndependent
        • E:\matc_project\demo\3rd\include\robin-map
      • VS C++语言标准:预览 - 最新 C++ 工作草案中的功能 (/std:c++latest)

      • SDL检查:否

      • 宏:WIN32

      • 运行库:多线程 (/MT)

Resgen 工程分离

  • 分离成 “Resgen 代码 + lib” 形式

    • resgen 比较简单,只依赖于第三方库 getopt 和 内部库 utils
  • 工程结构
    • include : Filament 内部库头文件文件夹
    • lib:Filament 内部库lib文件夹
    • resgen: resgen 源代码文件夹
    • 3rd: Filament使用的第三方库文件夹
      • include:第三方库有文件
      • lib: 第三方库lib
  • 工程配置 (IDE VS2022)(Release 版本)
    • 第三方库引入

      • getopt

        • 头文件

          • G:\clear_filament\third_party\getopt\include

            • getopt文件夹复制到
            • 3rd/include 中
        • lib
          • G:\clear_filament\soar\third_party\getopt\Release

            • getopt.lib复制到
            • 3rd/lib 中
    • 内部库引用
      • utils

        • 头文件

          • G:\clear_filament\libs\utils\include

            • utils文件夹复制到
            • include 中
        • lib
          • G:\clear_filament\soar\libs\utils\Release

            • utils.lib 复制到
            • lib 中
    • resgen 代码引入
      • G:\clear_filament\tools\resgen\src
      • main.h复制到工程根目录
    • VS配置
      • lib

           getopt.libutils.libshlwapi.lib
        
      • 附加包含目录
        • E:\matc_project\demo\include
        • E:\matc_project\demo\3rd\include
      • 运行库:多线程 (/MT)

总结

   Material System 这部分先总结到这里。应该说已经把 Filament 如何使用材质和管理 shader 代码片元部分都做了总结。如何使用由材质包生成的shader代码在之后总结Filament框架时再研究。

Google Filament 源码学习(六):Material System (五) - 材质系统框架相关推荐

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

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

  2. Google Filament 源码学习(四):Material System (三) - 材质格式 (mat)

    目录 Filament Materials Guide Introduction Material definitions Format (材质定义的格式) Differences with JSON ...

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

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

  4. Google Filament 源码学习(三):Material System (二)

    目录 Filament Materials Guide Introduction 相关术语与概念 Material Models Lit Model Base Color Metallic Rough ...

  5. Google Filament 源码学习(五):Material System (四) - 材质系统 API

    目录 Shader public APIs Introduction Types Math Matrices Frame constants Vertex only Fragment only Han ...

  6. Google Filament 源码学习(二):三方库分类总结

    前言 拿到Filament代码一头雾水,到底要怎么看呢,先从第三方库看起吧,如下对三方库进行了分类梳理. 注:刚刚开始学习,有很多库和基本概念都不是很清楚,有不当之处请大家随时指出,本人一定虚心接受. ...

  7. 基于Qt5.14.2和mingw的Qt源码学习(三) — 元对象系统简介及moc工具是如何保存类属性和方法的

    基于Qt5.14.2和mingw的Qt源码学习(三) - 元对象系统简介及moc工具是如何保存类属性和方法的 一.什么是元对象系统 1.元对象系统目的 2.实现元对象系统的关键 3.元对象系统的其他一 ...

  8. [spring源码学习]六、IOC源码-BeanFactory和factory-bean

    https://www.cnblogs.com/jyyzzjl/p/5459335.html 一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean ...

  9. RocketMQ源码学习(六)-Name Server

    问题列表: Name Server 的作用是什么? Name Server 存储了Broker的什么信息? Name Server 为Producer的提供些什么信息? Name Server 为Co ...

最新文章

  1. R语言Goldfeld-Quandt检验实战:检验回归模型中是否存在异方差性(heteroscedasticity)、发生了异常差(heteroscedasticity)问题如何解决
  2. 透视宇宙:大约138亿年前,宇宙真的发生过大爆炸吗?
  3. 《用Python进行自然语言处理》第 9 章 建立基于特征的文法
  4. 学习python是干嘛的-学 Python 都用来干嘛的?
  5. linux mmap 详解【转】
  6. 设置placeholder无效解决办法
  7. Flask实战2问答平台-登录限制(装饰器)
  8. java http get json_java实现Http post(参数json格式)、get 请求
  9. 2008年浙江大学计算机及软件工程研究生机试真题
  10. MySQL模糊查询—between and关键字
  11. POJ - 2449 Remmarguts' Date(第k短路:spfa+A*)
  12. 配置Servlet3.0的方式和注意事项!
  13. eclipse插件svn账号信息清空重新登陆
  14. 强化学习过程中对产生的无效动作应该如何进行屏蔽处理?(强化学习中可变的动作空间怎么处理)
  15. 生成32位,16进制的UUID
  16. unity开发抽奖系统
  17. android开发多国语言对照表
  18. DolphinDB 助力 WILLIAM O’NEIL 笑傲股市
  19. 单片机是不是嵌入式呢,老生常谈了
  20. SQL专项复习(使用GROUP BY, WITH AS)——习题篇02

热门文章

  1. python实现梯度下降法
  2. VSCode用Run code插件配置python环境(win10)
  3. this指向,认识与理解this指向
  4. linux动态链接库全局变量共享问题DLL共享数据段
  5. Eclipse j2ee开发环境的搭建
  6. Java序列化(Serialize)
  7. grep命令_Linux grep命令
  8. 怎么重装服务器的系统,怎么重装服务器操作系统
  9. ECMAScript 2019(ES10) 的新特性总结
  10. 华为 eNSP 模拟器练习1