OPENGL(ubuntu下的实践)——实用篇

OpenGL使用Assimp库导入3d模型

在一些商业的游戏应用中模型的网格是由美工艺术家使用一些建模软件创建的,例如:Blender,Maya,3ds Max等。这些软件提供了强大的工具来帮助美工创建复杂的模型。

Assimp(Open Asset Import Library)是一个处理很多3D格式文件的开源库,包括最流行的3d格式,在Linux和Windows系统都可以很方便的使用。这个模型解析库可以很容易的整合到C/C++程序中使用。

Mesh类

Mesh类表示的是Assimp框架和我们的OpenGL程序的接口:

  • LoadMesh()

LoadMesh()函数的参数,加载模型然后创建模型中包含的且我们的程序能够理解的顶点缓冲,索引缓冲和纹理对象数据。

  1. 创建了Assimp::Importer类的一个实例,调用其ReadFile方法来读取文件,获得一个指向aiScene对象的指针。这个对象包含整个模型的内容,并分布在模型不同的aiMesh结构中
  2. 调用InitFromScene()函数来初始化这个Mesh对象。分配mesh对象的内存空间、准备我们要用的纹理向量以及所有的网格数据和材质
  3. 解析模型数据将顶点属性数据依次存放到Vertices容器中
  4. 创建索引缓存
  5. 用顶点和索引向量完成MeshEntry结构体的初始化
  6. 加载模型所用的所有纹理。一个材质是可以包含多个纹理的,但并不是所有的纹理都必须包含颜色。例如,一个纹理可以是高度图、法向图、位移图等。当前我们针对光照计算的着色器程序只使用一个纹理,而我们也只关心漫反射纹理
  • Render()

Render()函数来渲染模型网格,Assimp使用一个aiScene对象来表示加载的mesh网格

  1. mesh的渲染以前是主函数的一部分。它遍历m_Entries数组,将数组中每个节点的顶点缓冲和索引缓冲绑定在一起。节点的材质索引用来从m_Texture数组中取出纹理对象,并将这个纹理绑定
  2. 最后执行绘制命令。

Mesh类中的每一个结构体都对应于aiScene对象中的一个mesh结构体,结构体中包含了顶点缓冲,索引缓冲以及材质的索引。

tutorial22.cpp

额外的工作是深度测试,防止距离相机较远的三角形被绘制在了距离较近的三角形的上面。

  1. 在 GLUTBackendRun()函数中glEnable(GL_DEPTH_TEST);开启深度测试
  2. glutInitDisplayMode对深度缓存的初始化
  3. glClear清除深度缓存

绘制模型

获得深度图

参考博客

1、深度

     所谓深度,就是在openGL坐标系中,像素点Z坐标距离摄像机的距离。摄像机可能放在坐标系的任何位置,那么,就不能简单的说Z数值越大或越小,就是越靠近摄像机。

2、深度缓冲区

深度缓冲区原理就是把一个距离近裁剪面的深度值与窗口中的每个像素相关联。

首先,使用glClear(GL_DEPTH_BUFFER_BIT),把所有像素的深度值设置为最大值(一般是远裁剪面)

然后,在场景中以任意次序绘制所有物体。硬件或者软件所执行的图形计算把每一个绘制表面转换为窗口上一些像素的集合,此时并不考虑是否被其他物体遮挡。

 

 

 

 

 

 

 

你可能感兴趣的:(实验室工作)