Aquacolor

Aquacolor



LearningOpenGL【13】

Gumdrop · 2025-09-10 · 4浏览 · 未分类


(新库真的很难学)

Assimp库介绍

这里的Ass是Asset,imp是import。在程序中具有以ai-作为前缀的类型名称。

它导入模型的方法比较简单,但是存储导入的模型的数据结构稍微有点复杂。(数据结构还是需要学习的)

Assimp::Importer importer;
const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate);

这个指向aiScene的指针就是用于后续处理的所有数据,其中包含了要用于配置VAO等的顶点数据和要用stbi导入的纹理信息。

  1. 纹理信息是用于stbi从文件目录中查找到对应纹理,而顶点数据此时已经传入了空间。

  2. 该库的类型基本上是通过指针使用的,所以其成员基本存储的是指针类型或者unsigned int这种用于数组索引的类型,这是为了节省空间开销,但是导致了数据结构比较复杂。

mesh和model

这两个概念是模型的概念,但是也用于Assimp库。mesh是一个绘制单元,而model是mesh的最大集合。

一个mesh可以有子mesh,这使得在model文件中,mesh以树的结构存储。

为了绘制model,要通过遍历树的形式来绘制所有mesh,但是通常的做法是在处理const aiScene*时直接将树结构转换为线性结构,便于遍历绘制。

aiMesh并不提供绘制方法,所以你需要自己实现对aiMesh的递归绘制。

在使用绘制方法前,要通过一些手段取出自己需要的数据再进行绘制,这是为了避免使用庞大而复杂的ai类对象。

model

aiSceneModel的转换。

把原来以树结构存在的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 评论区

添加新评论





  • ©2025 bilibili.com

textsms
内容不能为空
account_circle
昵称不能为空
email
邮件地址格式错误
web
beach_access
验证码不能为空
keyboard发表评论


star_outline 咱快来抢个沙发吧!




©2025 Aquacolor

鄂ICP备2024059763号-1

鄂公网安备42011102005556号



Theme Romanticism2.1 by Akashi
Powered by Typecho