OpenGL3.3模型载入

模型载入
assimp貌似目前不能导入3ds模型文件
assimp导入一个模型会将整个模型加载进一个场景对象 我的理解就是这个场景对象里面会包含每个纹理的图片叫什么比如left.rgb之类的(这些图片放进项目的时候不能再改名字了)
这个场景对象包含导入的模型/场景中的所有数据(顶点,纹理之类的)
场景对象包含了场景根节点的引用
根节点会有一系列索引 这些索引指向场景对象中mMeshes数组储存的网格数据
一个Mesh网格对象本身包含了渲染所需要的所有相关数据 像是顶点位置、法向量、纹理坐标、面(Face)和物体的材质
一个网格包含了多个面。Face代表的是物体的渲染图元
一个面包含了组成图元的顶点的索引 一个面包含了多个索引,它们定义了在每个图元中,我们应该绘制哪个顶点,并以什么顺序绘制
一个网格也包含了一个Material对象,它包含了一些函数能让我们获取物体的材质属性,比如说颜色和纹理贴图
总结一些 就是模型会被加载在scane场景对象中 所以这个场景对象就包含了模型的所有数据 然后这个场景对象有一个根节点 根节点会有一系列索引 指向的是网格 而网格包含渲染需要的数据

Assimp会将场景载入为一系列的节点 每个节点包含了场景对象中所储存数据的索引,每个节点都可以有任意数量的子节点 所有场景/模型数据都包含在场景对象中
一个网格是我们在OpenGL中绘制物体所需的最小单位(顶点数据、索引和材质属性)

流程就是
1.将一个物体加载到Scene对象中 Assimp会将场景载入为一系列的节点
2.遍历节点,获取对应的Mesh网格对象(我们需要递归搜索每个节点的子节点)
3.处理每个Mesh对象来获取顶点数据、索引以及它的材质属性 将这些数据存储在一个结构体数组里面
4.最后将这些数据传递给着色器。
5.最终的结果是一系列的网格数据,我们会将它们包含在一个Model对象中。

mesh在他自己的构造函数的时候就把这个模型的数据比如说顶点 法线这些顶点数据如何分配就已经存储在每个mesh自己的vao中了

在将模型加入家居项目中时出现的问题:
1.#include<stb_image.h>头文件出现重复问题(在model.h和loadTexture.cpp文件中都出现了(我也不知道为什么这样都会起冲突))
解决方法就是把删除model.h的#include<stb_image.h>头文件,将需要调用次头文件的相应函数定义在loadTexture.cpp中 并且让model.h包含loadTexture.h 这样就没有起冲突了 但是缺点就是以后加载模型都要包含loadTexture文件
2.一不小心将Model model(xxx)的定义放在了主函数之外或者主函数之内OpenGL初始化之前 就会导致地址访问冲突问题
函数
预处理指令offsetof(s, m)
它的第一个参数是一个结构体,第二个参数是这个结构体中变量的名字。这个宏会返回那个变量距结构体头部的字节偏移量

Assimp::Importer importer;
const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);
第一个参数:填写一个要处理的文件路径
第二个参数:后期处理的选项
aiProcess_Triangulate:如果模型不是(全部)由三角形组成,它需要将模型所有的图元形状变换为三角形
aiProcess_GenNormals:如果模型不包含法向量的话,就为每个顶点创建法线。
aiProcess_SplitLargeMeshes:将比较大的网格分割成更小的子网格,如果你的渲染有最大顶点数限制,只能渲染较小的网格,那么它会非常有用。
aiProcess_OptimizeMeshes:和上个选项相反,它会将多个小网格拼接为一个大的网格,减少绘制调用从而进行优化。
aiProcess_FlipUVs:将在处理的时候翻转y轴的纹理坐标(你可能还记得我们在纹理教程中说过,在OpenGL中大部分的图像的y轴都是反的,所以这个后期处理选项将会修复这个
aiProcess_CalcTangentSpace:Assimp会为每个加载的顶点计算出柔和的切线和副切线向量

GetTextureCount函数检查储存在材质中纹理的数量
mat->GetTextureCount(type)

mat->GetTexture(type, i, &str);
GetTexture获取每个纹理的文件位置,它会将结果储存在一个aiString中

TextureFromFile
texture.id = TextureFromFile(str.C_Str(), this->directory);
它将会(用stb_image.h)加载一个纹理并返回该纹理的ID
mesh.h
model.h

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值