Google Filament 源码学习(六):Material System (五) - 材质系统框架
目录
- 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
- 输出文件的路径
- Value
- -p,–platform
- Value
- desktop/mobile/all
- Usage
- 指定输出 platform
- Value
- -a,–api
- Value
- opengl/vulkan/all
- Usage
- 指定目标图形API
- Value
- -S, --optimize-size
- Value
- N/A
- Usage
- 在优化性能的同时,优化编译材质的大小
- Value
- -r, --reflect
- Value
- parameters
- Usage
- 将指定的元数据以JSON格式输出
- Value
- -v, --variant-filter
- Value
- [variant]
- Usage
- 筛选出指定的逗号分分隔的 variant
- Value
- 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
- 250行开始为编译材质包的代码,如下
- 测试
- 可以尝试使用命令行编译材质包
- 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 中
- G:\clear_filament\third_party\getopt\include
- lib
- G:\clear_filament\soar\third_party\getopt\Release
- getopt.lib复制到
- 3rd/lib 中
- G:\clear_filament\soar\third_party\getopt\Release
- 头文件
- glslang
- 头文件
- G:\clear_filament\third_party\
- glslang文件夹复制到
- 3rd/include/中
- G:\clear_filament\third_party\
- 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 中
- G:\clear_filament\soar\third_party\glslang\tnt\glslang\Release
- 头文件
- robin-map
- 头文件
- G:\clear_filament\third_party\robin-map
- robin-map文件夹复制到
- 3rd/include 中
- G:\clear_filament\third_party\robin-map
- 头文件
- smol-v
- 头文件
- G:\clear_filament\third_party\smol-v\source
- smolv.h 复制到
- 3rd/include 中
- G:\clear_filament\third_party\smol-v\source
- lib
- G:\clear_filament\soar\third_party\smol-v\tnt\Release
- smol-v.lib 复制到
- 3rd/lib 中
- G:\clear_filament\soar\third_party\smol-v\tnt\Release
- 头文件
- spirv-cross
- 头文件
- G:\clear_filament\third_party\spirv-cross\include
- spirv_cross文件夹复制到
- 3rd/include 中
- G:\clear_filament\third_party\spirv-cross\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 中
- G:\clear_filament\soar\third_party\spirv-cross\tnt\Release
- 头文件
- spirv-tools
- 头文件
- G:\clear_filament\third_party\spirv-tools\include
- spirv-tools文件夹复制到
- 3rd/include 中
- G:\clear_filament\third_party\spirv-tools\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 中
- G:\clear_filament\soar\third_party\spirv-tools\source\Release
- 头文件
- getopt
- 内部库引用
filamat
- 头文件
- G:\clear_filament\libs\filamat\include
- filamat文件夹复制到
- include 中
- G:\clear_filament\libs\filamat\include
- lib
- G:\clear_filament\soar\libs\filamat\Release
- filamat.lib 复制到
- lib 中
- G:\clear_filament\soar\libs\filamat\Release
- 头文件
utils
- 头文件
- G:\clear_filament\libs\utils\include
- utils文件夹复制到
- include 中
- G:\clear_filament\libs\utils\include
- lib
- G:\clear_filament\soar\libs\utils\Release
- utils.lib 复制到
- lib 中
- G:\clear_filament\soar\libs\utils\Release
- 头文件
filabridge
- 头文件
- G:\clear_filament\libs\filabridge\include
- filament 和 private 文件夹复制到
- include 中
- G:\clear_filament\libs\filabridge\include
- lib
- G:\clear_filament\soar\libs\filabridge\Release
- filabridge.lib 复制到
- lib 中
- G:\clear_filament\soar\libs\filabridge\Release
- 头文件
shaders
- 头文件
- G:\clear_filament\soar\shaders\generated
- shaders.h复制到
- include 中
- G:\clear_filament\soar\shaders\generated
- lib
- G:\clear_filament\soar\shaders\Release
- shaders.lib 复制到
- lib 中
- G:\clear_filament\soar\shaders\Release
- 头文件
filament
- 头文件
- G:\clear_filament\filament\backend\include
- backend 和 private 文件夹复制到
- include 中
- G:\clear_filament\filament\backend\include
- 头文件
math
- 头文件
- G:\clear_filament\libs\math\include
- math 文件夹复制到
- include 中
- G:\clear_filament\libs\math\include
- 头文件
sca
- 头文件
- E:\filament\libs\filamat\src\sca
- builtinResource.h 复制到
- include/sca 中
- E:\filament\libs\filamat\src\sca
- 头文件
licenses
- 头文件
- E:\filament\soar_vk\tools\matc\generated\licenses
- licenses.inc 复制到
- include/licenses 中
- E:\filament\soar_vk\tools\matc\generated\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 中
- G:\clear_filament\third_party\getopt\include
- lib
- G:\clear_filament\soar\third_party\getopt\Release
- getopt.lib复制到
- 3rd/lib 中
- G:\clear_filament\soar\third_party\getopt\Release
- 头文件
- getopt
- 内部库引用
- utils
- 头文件
- G:\clear_filament\libs\utils\include
- utils文件夹复制到
- include 中
- G:\clear_filament\libs\utils\include
- lib
- G:\clear_filament\soar\libs\utils\Release
- utils.lib 复制到
- lib 中
- G:\clear_filament\soar\libs\utils\Release
- 头文件
- utils
- 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)
- lib
- 第三方库引入
总结
Material System 这部分先总结到这里。应该说已经把 Filament 如何使用材质和管理 shader 代码片元部分都做了总结。如何使用由材质包生成的shader代码在之后总结Filament框架时再研究。
Google Filament 源码学习(六):Material System (五) - 材质系统框架相关推荐
- Google Filament 源码学习(二):Material System (一)
目录 前言 Material System Introduction Standard Model (标准材质) Standard Model Standard Model Summary Impro ...
- Google Filament 源码学习(四):Material System (三) - 材质格式 (mat)
目录 Filament Materials Guide Introduction Material definitions Format (材质定义的格式) Differences with JSON ...
- Google Filament 源码学习(一):Filament 编译
目录 前言 一.环境说明 二.环境搭建 1. Visual Studio 2019 2. Git & Cmake & Python3.7 安装 3. 克隆 Filament 源代码 4 ...
- Google Filament 源码学习(三):Material System (二)
目录 Filament Materials Guide Introduction 相关术语与概念 Material Models Lit Model Base Color Metallic Rough ...
- Google Filament 源码学习(五):Material System (四) - 材质系统 API
目录 Shader public APIs Introduction Types Math Matrices Frame constants Vertex only Fragment only Han ...
- Google Filament 源码学习(二):三方库分类总结
前言 拿到Filament代码一头雾水,到底要怎么看呢,先从第三方库看起吧,如下对三方库进行了分类梳理. 注:刚刚开始学习,有很多库和基本概念都不是很清楚,有不当之处请大家随时指出,本人一定虚心接受. ...
- 基于Qt5.14.2和mingw的Qt源码学习(三) — 元对象系统简介及moc工具是如何保存类属性和方法的
基于Qt5.14.2和mingw的Qt源码学习(三) - 元对象系统简介及moc工具是如何保存类属性和方法的 一.什么是元对象系统 1.元对象系统目的 2.实现元对象系统的关键 3.元对象系统的其他一 ...
- [spring源码学习]六、IOC源码-BeanFactory和factory-bean
https://www.cnblogs.com/jyyzzjl/p/5459335.html 一.代码实例 在我们分析spring的IOC源码的时候,发现除了配置标准的bean,并且通过getBean ...
- RocketMQ源码学习(六)-Name Server
问题列表: Name Server 的作用是什么? Name Server 存储了Broker的什么信息? Name Server 为Producer的提供些什么信息? Name Server 为Co ...
最新文章
- R语言Goldfeld-Quandt检验实战:检验回归模型中是否存在异方差性(heteroscedasticity)、发生了异常差(heteroscedasticity)问题如何解决
- 透视宇宙:大约138亿年前,宇宙真的发生过大爆炸吗?
- 《用Python进行自然语言处理》第 9 章 建立基于特征的文法
- 学习python是干嘛的-学 Python 都用来干嘛的?
- linux mmap 详解【转】
- 设置placeholder无效解决办法
- Flask实战2问答平台-登录限制(装饰器)
- java http get json_java实现Http post(参数json格式)、get 请求
- 2008年浙江大学计算机及软件工程研究生机试真题
- MySQL模糊查询—between and关键字
- POJ - 2449 Remmarguts' Date(第k短路:spfa+A*)
- 配置Servlet3.0的方式和注意事项!
- eclipse插件svn账号信息清空重新登陆
- 强化学习过程中对产生的无效动作应该如何进行屏蔽处理?(强化学习中可变的动作空间怎么处理)
- 生成32位,16进制的UUID
- unity开发抽奖系统
- android开发多国语言对照表
- DolphinDB 助力 WILLIAM O’NEIL 笑傲股市
- 单片机是不是嵌入式呢,老生常谈了
- SQL专项复习(使用GROUP BY, WITH AS)——习题篇02