文章目录

  • 体素化方法
    • 原理展示
    • 实现过程
      • 使用Buffer
      • 着色器
      • 读取体素坐标
    • 实现代码
      • 顶点着色器
      • 片元着色器
      • CPU读取
      • 效果图

体素化方法

体素化能够对模型进行简化,得到均匀的网格,在求模型的测地线,求交等过程中有较好的应用。个人理解,把体素化分为基于CPU的方法和基于GPU渲染的方法。输入是三角面片,输出体素化格子。

直接使用三角形求交的方法见
3D模型体素化(Voxelization)过程实现与分析(一)

使用三角形求交的方法,体素化计算量与三角形的数量,体素分辨率直接相关。当三角形数量增多,分辨率增大时,计算量将急剧增加,计算十分缓慢。
本文介绍使用OpenGL快速计算体素化的方法,使用渲染管线中的片段着色器,将三角形与体素的求交转化为采样点与体素的求交。运用片元的并行性,快速得到体素化结果。

原理展示

  1. 计算模型的包围盒
  2. 在包围盒外部设置相机,最好是用正交相机,进行投影
  3. 对于投影后的片元,计算每个片元的三维位置对应的体素【注意,深度测试前所有的片元都不会被丢弃】

实现过程

使用Buffer

这里需要从着色器回传会体素占用信息,使用一个一维的数组来展开三维的体素位置。uniform对于着色器是只读的。因此使用Buffer,着色器是可读写的,同时Buffer也允许使用较大的空间。

着色器

  1. 由于着色器是并行的,使用原子操作来实现同步。
  2. 所有从顶点着色器到片元着色器中的变量都会被插值,因此可以直接从顶点着色器计算三维坐标,传入到片元着色器。
  3. 片元着色器根据坐标位置,直接计算体素坐标,写入到数组中。

读取体素坐标

CPU中读取Buffer数组,解析出体素化结果。

实现代码

顶点着色器

#version 430 core
layout (location=0) in vec3 aPos;
layout (location=1) in vec3 aNormal;
layout (location=2) in vec2 aTexture;out vec3 FragPos;
uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;void main()
{   FragPos = aPos;        // 局部坐标gl_Position = projection *view *model *vec4(aPos,1.0);
}

片元着色器

#version 430 coreout vec4 FragColor;in vec3 FragPos;layout (std430, binding =0) buffer CountBuffer{int cnts[];
};uniform vec3 box_min;
uniform float interval;     // 步长
uniform vec3 xyz;           // 分辨率
uniform int pass;void main()
{if(pass ==0){   int x = int((FragPos.x-box_min.x)/interval);int y = int((FragPos.y-box_min.y)/interval);int z = int((FragPos.z-box_min.z)/interval);int idx = int(y *(xyz.z *xyz.x) + z *xyz.x + x);    atomicAdd(cnts[idx], 1);}FragColor = vec4(1, 0, 0, 1);
}

CPU读取

glBindBuffer(GL_SHADER_STORAGE_BUFFER, cntBO);       // 获取buffer指针
int * ptr = (int *)(glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_READ_ONLY));
// cout << "error node: " << glGetError() << endl;
vector<glm::vec3> pos;        // 体素位置
vector<glm::ivec3> idx;       // 体素索引
if (ptr != NULL)
{for (int i = 0; i < cnts.size(); ++i){if (*(ptr + i)){int y1 = i / (x*z);int z1 = (i - y1 *x*z) / x;int x1 = (i - y1*x*z - z1*x);pos.push_back(box_min + glm::vec3(x1*width, y1*width, z1*width));idx.push_back(glm::ivec3(x1, y1, z1));}}
}
else
{Error("read buffer data error");
}
glUnmapBuffer(cntBO);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);

效果图

如有错误,欢迎指出~

3D模型体素化(Voxelization)过程实现与分析(二)相关推荐

  1. 体素化(Voxelization) 3D模型体素化

    体素化(Voxelization)是将物体的几何形式表示转换成最接近该物体的体素表示形式,产生体数据集,其不仅包含模型的表面信息,而且能描述模型的内部属性.表示模型的空间体素跟表示图像的二维像素比较相 ...

  2. 体素化(Voxelization)

    参考链接 体素化(Voxelization)是将物体的几何形式表示转换成最接近该物体的体素表示形式,产生体数据集,其不仅包含模型的表面信息,而且能描述模型的内部属性.表示模型的空间体素跟表示图像的二维 ...

  3. open3d之体素化Voxelization有关函数详情(笔记6)

    点云和三角形网格是非常灵活但不规则的几何类型.体素网格是在常规 3D 网格上定义的另一种 3D 几何类型,而体素可以被认为是 2D 中像素的 3D 对应物.Open3D 具有可用于处理体素网格的几何类 ...

  4. 利用PCL点云下采样实现数据体素化

    利用PCL点云下采样实现数据体素化 PCL PCL(Point Cloud Library) 库集成了针对大体量级别的空间点数据处理所需要的算法和操作,降低了处理相关需求的复杂度,对快速建立点云数据文 ...

  5. Python 三维网格体素化

    本文主要是实现将一个网格模型体素化,实现不同分辨率的体素化效果,并且可视化输出为obj文件!首先利用trimesh对mesh进行采样,然后根据采样点得到各个体素点的占有值. 效果 通过调整分辨率以及采 ...

  6. 基于ROS2开发的点云体素化

    0. 简介 最近在收到了很多读者的消息后,我觉得有必要开这个坑,来给大家阐述下如何对激光雷达点云以及图像点云去做栅格化以及体素化的操作.这部分需要各位读者拥有PCL,octomap,ROS2,C++的 ...

  7. 浅议像素化与体素化part1—平面图形像素化

    什么是像素化 学计算机的人往往都比较清楚图形和图像的区别,而且往往能够从数据结构的角度理解这两者的区别,一般来说,图形是由几何空间中的基本图元所组成,表现为用外部轮廓线条勾勒成的矢量图.例如由计算机绘 ...

  8. 在Unity中实现体素化

    在Unity中实现体素化 博客链接:在Unity中实现体素化 体素化 类似与用网格存储二维平面,将三维空间划分成大量尺寸相同的小方块的过程就称之为体素化. 为什么要体素化 以下是个人理解 当场景中多边 ...

  9. matlab体素化,教程|如何使用Matlab制造GrabCAD体素打印切片

    想必大家对Stratasys最近推出的Voxel Print解决方案已经并不感到陌生了,但你是否已经知道如何使用Matlab制造GrabCAD体素打印切片了呢? 本教程面向已熟悉Matlab及J750 ...

最新文章

  1. Android 开发第四弹:围住神经猫(简单Demo)
  2. FastDFS设置开机启动
  3. 64bit win7+VS2013+opencv2.4.9配置
  4. 【Python】【Flask】
  5. python合并数组输出重复项_python进行数组合并的方法
  6. Java 面试题全梳理
  7. Java中选择排序,冒泡排序,插入排序,快速排序
  8. 应用程序如何链接静态QT Plugin库
  9. STM8输出PWM变频时波形断开解决方法
  10. 如何使用数据质量服务和SQL Server集成服务清除数据
  11. iPhone SDK开发基础之UIPageControl编程
  12. [转]find命令之exec
  13. h5问卷调查 html模版,问卷调查H5模板制作流程
  14. 华为手机遮挡html页面,手机知识:华为手机老是显示屏幕被遮挡
  15. 雅马哈音箱的usb驱动MAC-WINDOWS
  16. CobaltStrike木马免杀代码篇之python反序列化分离免杀(一)
  17. L1-031. 到底是不是太胖了
  18. 木子-后端-在没有视图层的情况下,怎样将前台数据直接发给逻辑层
  19. mysql忘记root密码拯救方法(flush privileges)
  20. matlab怎么画两个自变量的图_眼线液的画步骤图 眼线怎么画好看图解

热门文章

  1. Hackme-1靶机
  2. tinyXml生成XML文件
  3. CSS之文本框样式和水平居中
  4. IT采购,不再默默扛下“背刺”
  5. JavaScript高级语法之解释器(Interpreter)
  6. 【Cocos2d-X游戏实战开发】捕鱼达人之开发前准备工作(一)
  7. 公共计算机课程教学情况调查问卷,信息技术课程标准实施情况调查问卷.doc
  8. 求共同好友和好友推荐系统
  9. 如何使用sublime自动生成html,Sublime快速生成html页面
  10. 总结了90条简单实用的Python编程技巧