1.模型需求

存储三维模型的文件,通常需要更高效的空间分配,来尽量减少文件的物理体积。

例如一个模型,可能存有position,uv,normal,tangents ... 等等相关信息。

如果简单的存储为position数组,uv数组,由于这些数组钟可能会有重复数据,因此会造成存储空间的浪费:

因此,通过使用一个索引数组,可以更高效的利用有限的存储空间。

2.渲染需求

在我们使用底层图形API渲染模型时,首先我们需要将模型读入内存中。

我们了解到,许多模型通过使用索引来节省存储空间,而在渲染模型时,我们需要为API提供完整的三角形数据,所以我们需要还原索引为原始的形式。

这样,某个被周围三角形公用的顶点有可能会有数份相同的数据在内存中,不仅增加了内存的消耗,也增加了渲染时的消耗。

3.解决方案

为了解决模型与渲染需求不一致的问题,我们可以通过在载入模型后,对模型数据进行处理,来使其满足我们的渲染需求。

在Opengl中,可以通过element_array_buffer来进行Indexed Drawing,即通过一个索引,来减少重复数据,减少带宽的消耗。

接下来,只需要从原始顶点列表中,找出那些拥有相同数据的顶点,将其替换为索引,索引到我们的独立定点列表,就可以得到符合渲染需求的数据了。

第一时间,我们会想到使用嵌套循环来查找独立定点数组:

不过很显然,两个嵌套的循环,其中内循环会随着时间的推移而增长,卖域名这种方式的CPU消耗非常大。

甚至在发布模式下,处理一个5万顶点的模型都需要几秒钟来完成。

因此我们需要优化其中的内循环,即寻找unique vertex的方法。

如何优化此方法呢?通过查阅知名开源模型解析库Assimp的相关实现,看到了一个非常巧妙的办法。

我们可以通过空间排序来解决这个问题,将曾经需要遍历整个uniqueVertices列表的循环改为一个简单的查询操作。

Assimp的实现逻辑大致如下:定义一个随机平面

  • 遍历原始定点列表
  • 存储顶点到平面的距离,作为排序的key
  • 根据距离对处理的定点列表进行排序

这样,通过这个空间排序的结果,我们可以快速定位到与输入顶点位置接近的潜在相同顶点列表。

通常情况下,此优化得到的潜在相同顶点列表大小不会超过10个,大大提高了数据处理的效率。

将原本需要数万此的循环,减少为数十次,成功的完成了我们的渲染需求。

模型解析之独立顶点的筛选相关推荐

  1. 旧文重发:做人、做事,做架构师——架构师能力模型解析

    这篇文章发表于<程序员>2008.04期.其中有关模型图参见: http://blog.csdn.net/aimingoo/archive/2007/06/26/1667508.aspx ...

  2. 全网最硬核 Java 新内存模型解析与实验 - 2. 原子访问与字分裂

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  3. 全网最硬核 Java 新内存模型解析与实验 - 3. 硬核理解内存屏障(CPU+编译器)

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  4. Python基于statsmodels包构建多元线性回归模型:模型构建、模型解析、模型推理预测

    Python基于statsmodels包构建多元线性回归模型:模型构建.模型解析.模型推理预测 目录

  5. Qt Creator使用Clang代码模型解析C ++文件

    Qt Creator使用Clang代码模型解析C ++文件 使用Clang代码模型解析C ++文件 关于Clang代码模型 配置C语代码模型 lang检查 在项目级别指定Clang代码模型设置 使用编 ...

  6. Kubernetes应用部署模型解析(原理篇)

    2019独角兽企业重金招聘Python工程师标准>>> Kubernetes应用部署模型解析(原理篇) 博客分类: Kubernetes [编者按]Kubernetes可用来管理Li ...

  7. 3D姿态估计——ThreeDPose项目简单易用的模型解析

    前言 之前写过tensorflow官方的posenet模型解析,用起来比较简单,但是缺点是只有2D关键点,本着易用性的原则,当然要再来个简单易用的3D姿态估计.偶然看见了ThreeDPose的项目,感 ...

  8. POI报表入门,excel,使用事件模型解析百万数据excel报表

    POI报表入门,excel 1.pom依赖: <?xml version="1.0" encoding="UTF-8"?> <project ...

  9. 目标检测模型——One stage(YOLO v5的模型解析及应用)

    1. 简介 目标检测分为Two stage和One stage,只使用一个网络同时产生候选区域并预测出物体的类别和位置,所以它们通常被叫做单阶段检测算法(One stage).本篇文章只讲One st ...

最新文章

  1. erdas几何校正_ERDAS遥感图像的几何校正
  2. 金邦黑金刚4G内存 VS Vista系统
  3. CXF做的webservice简单例子
  4. 98页PPT,看懂阿里、小米、京东、美团的组织架构和战略变迁!
  5. 【STM32 .Net MF开发板学习-25】LED数码管显示
  6. JSP+Servlet + JDBC 实现简单的登录验证模块
  7. 高级定时器/TIM1/TIM8 定时时间不准的问题/TIM_TimeBaseStructure.TIM_RepetitionCounter
  8. Ajax传递json数据
  9. 机器学习Machine learning in action实战相关资料
  10. OpenCV4每日一练day8:模型投影函数projectPoints()
  11. 数据仓库中的两大经典模型
  12. 在 Windows 下远程桌面连接 Linux - XManager 篇
  13. 蚂蚁金服的生死时速!
  14. 郭天祥的10天学会51单片机_第四节
  15. 2019年信息泄露事件汇总
  16. 无线鼠标显示是台式计算机,无线鼠标怎么连接台式电脑?无线鼠标连接台式机与笔记本操作方法...
  17. 简单易懂的现代魔法-递归
  18. python保存模型方法_TensorFlow模型保存和提取的方法
  19. 重装系统后office去哪里安装?
  20. [转] 下班后的九种最佳放松方法

热门文章

  1. 这里有 8 个流行的 Python 可视化工具包,你喜欢哪个?
  2. java勇者大冒险_勇者大冒险 第一集 开车时英文歌 什么名
  3. maven上传源码脚本
  4. Redis-参数说明
  5. java线程学习第一天__低配版的卖面包机
  6. linux 服务 启动 关闭 列表
  7. Android Json解析与总结
  8. 闲谈StringBuilder
  9. Div+CSS 布局
  10. Ubuntu 9.04下安装source navigator---linux下看代码工具