(新库真的很难学)
Assimp库介绍
这里的Ass是Asset,imp是import。在程序中具有以ai-作为前缀的类型名称。
它导入模型的方法比较简单,但是存储导入的模型的数据结构稍微有点复杂。(数据结构还是需要学习的)
Assimp::Importer importer;
const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate);
这个指向aiScene的指针就是用于后续处理的所有数据,其中包含了要用于配置VAO等的顶点数据和要用stbi导入的纹理信息。
-
纹理信息是用于stbi从文件目录中查找到对应纹理,而顶点数据此时已经传入了空间。
-
该库的类型基本上是通过指针使用的,所以其成员基本存储的是指针类型或者unsigned int这种用于数组索引的类型,这是为了节省空间开销,但是导致了数据结构比较复杂。
mesh和model
这两个概念是模型的概念,但是也用于Assimp库。mesh是一个绘制单元,而model是mesh的最大集合。
一个mesh可以有子mesh,这使得在model文件中,mesh以树的结构存储。
为了绘制model,要通过遍历树的形式来绘制所有mesh,但是通常的做法是在处理const aiScene*时直接将树结构转换为线性结构,便于遍历绘制。
aiMesh并不提供绘制方法,所以你需要自己实现对aiMesh的递归绘制。
在使用绘制方法前,要通过一些手段取出自己需要的数据再进行绘制,这是为了避免使用庞大而复杂的ai类对象。
model
从aiScene
到Model
的转换。
把原来以树结构存在的aiMesh
对象的数据复制一份到Model
对象的vector成员。
还要把用aiMaterial
材质方式打包的纹理导入成Texture
纹理对象,并且解包成Model
对象的向量成员或者unordered_map成员。
(这种类型的操作因为很久没做过了所以完全不会打)
mesh
将aiMesh
中以分离存储的顶点属性转换成在Mesh
中交错存储,交错存储使得同一顶点的属性在同一缓存区,利于缓存命中。
非顶点属性,以纹理形式存在,而一个aiMesh
只对应一个aiMaterial
,一个aiMaterial
对应多个aiString
即纹理名称。
将纹理全部导入后存储在Model
中,而Mesh
中要留有索引以在绘制方法中传入对应纹理。索引可以是指针、迭代器、引用,或者直接是一份拷贝。
纹理进阶
所谓纹理就是一个图像,而这个图像可以包含各种信息的,在之前的内容中也提到了一些用法,比如利用纹理承载ambient、diffuse、specular的光照信息。这时纹理其实就和狭义的纹理区分开来了,不再仅代表物体的颜色。
物体的着色事实上依靠着一组参数,而每个片段要获取实际参数时都通过采样器+纹理进行。这时纹理分为了diffuse、specular、normal、roughness……纹理代替了此前的传入结构组的方式和顶点插值的方式,实现复杂和像素级别的着色。
总结
还是先往后看吧这东西涉及太多内容了。
(教程后面的内容真的抽象)
comment 评论区
star_outline 咱快来抢个沙发吧!