QT+OPenGL八之模型准备
配置assimp:https://blog.csdn.net/qq_36383623/article/details/85303483
Assimp是Open Asset Import Library(开放的资产导入库)的缩写
在了解模型之前必须要了解一些知识点,不然对模型数据有无尽的困惑,模型通常是用编辑器如3dmax等绘制导出的格式不同,内部的数据分布风格也不同,但我们都要把它转换成OpenGL所认识的数据才能绘制出来。Assimp就是把不同格式的模型,加载成同一种结构。我们只需要了解Assimp的结构就能获取模型数据。
网络:
image.png注意这里很重要,决定了能否看懂后面assimp的代码,从root node开始每个节点都保存了一个mNumMeshes(当前节点的网络mesh数量),且每个节点的mMeshes[](mMeshes[i]当前节点的第几个网络)会返回一个mesh的全局索引。而scene中的mMeshes[]所需的就是这个索引,因为它会准确的找到具体的mesh对象。从root node节点开始每个节点都存储了mNumChildren(当前节点的孩子数),有了这些我们就可以运用循环和递归遍历所有的网络mesh节点。当然还有其他类似的数据,看代码就能搞明白了。
法线:
法线的作用是用来影响光照,因为我们要构想出模拟现实相类似的场景,只有用法线去影响光照,大家可以去learnOpenGL了解光照(后面我们会研究它),因为我认为应该先绘制出模型再来研究光照,因为我们手里头压根儿没得模型,谈何光照一说啊,我可还不会自己计算法线。法线其实之前使我困惑,我以为法线是面的法线,其实错了,程序并不清楚面这个概念,所谓的面在OpenGL里实际上是由哪几个点连起来组成面,而程序只知道点的数据,所以法向量是点的的法向量。那么问题来了点怎么会有法向量啊?learnOpenGL里讲点的法向量实际上是根据这个点周围的点产生的面根据叉乘产生的法向量(不得不说他描述得不清楚),这里看着模模糊糊的所以我按照我的理解去画图。
image.png
所以系统插值的时候就能根据从顶点法线向周围发散(顶点周围的法线接近于顶点处的方向)来处理像素。好在导入模型的时候,都有法线我们不用管他嘻嘻,感觉想法多余了点。
索引:
我们之前绘制立方体,没有用索引,而是根据特定的顺序(从第0个点,3个点为1个面,绘制多少个这样的面),来绘制的,很显然这样效率不高,因为每一个点我们都没有重用,导致gpu内存的浪费。而对于复杂庞大的模型,浪费得就更多,为了节省空间,提高效率。采用索引就可以达到目的。三角形为图元绘制立方体我们需要绘制12个三角形,36个顶点,然而我们采用索引,一个立方体只需8个顶点也能绘制出三角形图元的立方体。只需指定哪些点组成一个面即可。
材质:
模型反射光时体现的像素,因为后面我们会研究,这里了解基本概念,比如1金属反射出高光比较多,木头几乎没有高光,都是漫反射,材质可以告诉着色器,需要怎样反射像素。
struct Material
{
vec3 ambient;//环境光反射颜色
vec3 diffuse;//漫反射反射颜色
vec3 specular;//镜面反射反射颜色
float shininess;//镜面反射散射半径
};
其他数据,当然除了上面所说的数据,模型还会有骨骼,动画等等
目录
VSC++2019+QT+OpenGL
QT+OpenGL一之绘制立方体(三角形图元)
QT+OpenGL二之纹理贴图
QT+OpenGL三之矩阵简解
QT+OpenGL四之相机的移动和旋转
QT+OpenGL五之绘制不同的模型(vao,vbo机制)
QT+OpenGL六之天空盒
QT+OpenGL七之使用EBO
QT+OPenGL八之模型准备
QT+OPenGL九之模型解码
QT+OPenGL十之光照模型
QT+OPenGL十一之漫反射和镜面反射贴图
QT+OPenGL十二之定向光
QT+OPenGL十三之真正的点光源和聚光灯
QT+OPenGL十四之多光源混合的问题
QT+OPenGL十五之深度缓冲区
QT+OPenGL十六之模板缓冲区
QT+OPenGL十七帧缓冲区(离屏渲染)
QT+OPenGL十八抗锯齿
QT+OPenGL十九镜面反射效率调整
QT+OPenGL二十Gamma校正