0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于 GPU 渲染的高性能空间包围计算

图扑-数字孪生 来源:图扑-数字孪生 作者:图扑-数字孪生 2024-02-18 10:47 次阅读

空间包围检测在计算机图形学、虚拟仿真工业生产等有着广泛的应用。

现代煤矿开采过程中,安全一直是最大的挑战之一。地质空间中存在诸多如瓦斯积聚、地质构造异常、水文条件不利等隐蔽致灾因素,一旦被触发,可能引发灾难性的后果。因此在安全生产过程中有效的管理和规避各隐蔽致灾因素,有着重要的意义。

通过对煤矿地质空间中各地质因素建模,建立空间数据库,还原地下真实场景,使用计算机图形学进行空间计算,可以实时监测各隐蔽致灾因素的位置和距离,指导安全生产,并进行可视化展示。

空间包围检测有多种方法,比如基于包围盒的检测,三角面碰撞检测等。本文提出了一种基于 GPU 渲染的高效计算方法。

假定待检测球体范围的半径为r。两种检测方法如下:

方法 1:遍历模型所有的点,计算点和球心的距离。如果有距离小于 r,模型在球体范围内。
方法 2:以检测区域的包围盒为正交投影空间,渲染所有需要检测的模型。渲染过程中计算每个渲染点到球心的距离,如果有距离小于r的渲染点,模型在球体范围内。
模型和检测区域有以下几种位置关系:

wKgaomXDNlaAF5TBAACBYZPwGrU286.png

图 1:模型完全在球体范围内:方法 1 可检测
图 2:模型部分点在球体范围内:方法 1 可检测
图 3:模型点不在球体范围内,部分三角面在球形范围内:方法 2 可检测
图 4:模型不在球体范围内:方法 1 + 2 可检测
图 5:模型完全包含球体范围:模型如果是空心的,方法 1 + 2 可检测模型不在球体范围内。如果需要计算结果是模型在球体范围内,也就是模型是实心的,建模时需要在模型内部加上额外的辅助计算的三角面,用于表达内部信息。此时用方法 1 + 2 可检测模型在球体范围内。

wKgZomXDNlaAO3BaAACn5i3av6c516.png

以上方法使用 WebGL 渲染到纹理(Render To Texture) 和 readPixels 功能。图扑 HT for Web SDK 组件库对 WebGL 底层复杂操作做了封装, 为用户省掉了繁琐的底层 WebGL 操作,可以方便快捷的实现正交透视、渲染到纹理和异步 readPixels 等高级 WebGL 功能。

方法 1:点检测法
准备一张 N X N 纹理图 texture1(HT RenderTarget),保证要检测的模型的数量不大于 N X N。每一个模型在纹理上分配一个像素,像素的位置为 (x,y)。

创建点渲染模式着色器程序,实现以下功能:

顶点着色器:检测每个点到球心的距离,将距离是否小于r的信息传给片段着色器。指定的位置 (x,y) 赋给 gl_Position。
片段着色器:如果距离小于 r, 渲染红色,否则不渲染颜色。
JavaScript 程序遍历每一个待检测模型,将模型的顶点和模型在纹理上的位置 (x,y) 通过 attribute 和 uniform 传给顶点着色器。所有模型渲染结束后,使用异步 readPixels 将渲染结果读出来。通过判断读取结果里每个像素点颜色值,获得模型是否在球体内部信息。

wKgaomXDNlaAGsnqAAEt-uqadOc011.png

主要代码:

// 创建渲染材质1
const texture1 = new ht.graph3d.RenderTarget(g3d, g3d.getGL(), 100, 100);
 
// 循环渲染所有的模型,结果保存到texture1。
for (let i = 0; i < nodeCount; i++) {
    data = datas[i];
    tModel = getDataMesh(data); // 获取模型网格信息
    // 准备着色器数据
    tModel.mat = model4.mat;
    tModel.matDef[DEFAULT_MAT_NAME] = model4.mat;
    tModel.mat.modelMat = data.getMatrix4().toArray();
    x = i % 100;
    y = Math.floor(i / 100);
    model4.mat.uPos = [x / 100 * 2 - 1 + 1 / 200, 2 * y / 100 - 1 + 1 / 200];
    // 渲染到texture1
    g3d.setViewport(gl, 0, 0, 100, 100);
    g3d.renderModel(texture1, model4, {
        clear: false
    });
}
 
// 读取检测结果
texture1.readPixelsAsync(0, 0, 100, 100, null, (result) = > {
    for (let y = 0; y < 100; y++) {
        for (let x = 0; x < 100; x++) {
            // 遍历像素点,检测是否是红色
            // ......
        }
    }
});

方法 2:面检测法
准备两张纹理贴图 texture1 和 texture2。Texture1 的要求同方法 1。Texture2 默认使用 1000 X 1000 的分辨率。

创建两套着色器。第一套着色器使用三角面渲染:

顶点着色器:正常计算顶点投影信息
片段着色器:检测每一个点到球心的距离,如果小于 r,渲染红色
第二套着色器使用点渲染:

顶点着色器:根据输入的 texture2 坐标(attribute),使用 texture2D 获取对应位置的颜色值,如果是红色,表示模型在球体内部,将此信息传给片段着色器。模型在 texture1 上的位置信息 (x,y) 赋给 gl_Position。
片段着色器:如果距离小于 r, 渲染红色,否则不渲染颜色。
JavaScript 程序遍历每一个模型,使用着色器 1 将结果渲染到 texture2。渲染过程使用正交透视矩阵,视锥是球体的包围盒。JavaScript 将 texture2 (uniform sampler2D)、texture2 每个像素的 x, y位置信息 (attribute)、模型在 texture1 上的位置信息 (uniform) 传给顶点着色器 2。片段着色器 2 将模型是否在球体内的信息渲染到 texture1。所有模型渲染结束后,使用异步 readPixels 将渲染结果读出来。通过判断读取结果里每个像素点颜色值,获得模型是否在球体内部信息。

wKgZomXDNleARyZHAAEXWlZNxq0476.png

主要代码:

// 创建渲染材质1,2
 
const texture1 = new ht.graph3d.RenderTarget(g3d, g3d.getGL(), 100, 100);
 
const texture2 = new ht.graph3d.RenderTarget(g3d, g3d.getGL(), 1000, 1000);
 
 
// 循环渲染所有的模型到texture2。texture2信息渲染到texture1
 
for (let i = 0; i < nodeCount; i++) {
 
    data = datas[i];
 
    tModel = getDataMesh(data); // 获取模型网格信息
 
    // 准备着色器1数据
    tModel.mat = model2.mat;
    tModel.matDef[DEFAULT_MAT_NAME] = model2.mat;
    tModel.mat.modelMat = data.getMatrix4().toArray();
 
    // 渲染到texture2
    g3d.setViewport(gl, 0, 0, 1000, 1000);
    g3d.renderModel(texture2, tModel, { clear: true });
 
    // 准备着色器2数据
    model3.mat.uImage = texture2.texture;
    x = i % 100;
    y = Math.floor(i / 100);
    model3.mat.uPos = [x / 100 * 2 - 1 + 1 / 200, 2 * y / 100 - 1 + 1 / 200];
 
    // 渲染到texture1
    g3d.setViewport(gl, 0, 0, 100, 100);
    g3d.renderModel(texture1, model3, { clear: false });
 
 }

方法 1 简单快速。但检测结果不准确。方法 2 检测结果准确,但计算过程复杂。实际使用中两种方法结合使用。首先使用方法 1 检测。对于不在球体范围内的模型,再使用方法 2 检测。

如果需要检测椭球体范围或者长方体的范围,可以获取椭球体或长方的变换矩阵,计算获得逆矩阵。将逆矩阵应用于每一个待检测模型的节点。此时只需要检测变换后的模型是否在单位圆或单位立方体内即可。HT SDK 3D 引擎库提供了丰富的数学计算 API,可以非常直观简洁的实现以上功能。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gpu
    gpu
    +关注

    关注

    27

    文章

    4417

    浏览量

    126699
  • 检测
    +关注

    关注

    5

    文章

    4083

    浏览量

    90745
  • 渲染
    +关注

    关注

    0

    文章

    60

    浏览量

    10752
收藏 人收藏

    评论

    相关推荐

    思尔芯助力中微电自研高性能安全GPU芯片开发

        思尔芯(S2C)近日宣布,公司全芯片原型验证解决方案成功协助中微电(全称“深圳中微电科技有限公司”)首款拥有自主知识产权的高性能桌面电脑GPU芯片——“南风一号”流片成功。 GPU 就是图形
    发表于 02-27 15:39 1756次阅读
    思尔芯助力中微电自研<b class='flag-5'>高性能</b>安全<b class='flag-5'>GPU</b>芯片开发

    【昉·星光 2 高性能RISC-V单板计算机体验】体验Imagination GPU带来的丝滑3D图形渲染效果

    GPU渲染的glmark2 SDK镜像上集成了Imagination的GPU驱动,可以使用GPU进行图形渲染加速。另外,SDK镜像内部已经编
    发表于 12-24 21:24

    NVIDIA火热招聘GPU高性能计算架构师

    这边是NVIDIA HR Allen, 我们目前在上海招聘GPU高性能计算架构师(功能验证)的岗位,有意向的朋友欢迎发送简历到 allelin@nvidia.comWechat
    发表于 09-01 17:22

    智能网卡简介及其在高性能计算中的作用

    最先进的人工智能模型在不到五年的时间内经历了超过 5,000 倍的规模扩展。这些 AI 模型严重依赖复杂的计算和大量内存来实现高性能深度神经网络 (DNN)。只有使用 CPU、GPU 或专用芯片等
    发表于 07-28 10:10

    【昉·星光 2 高性能RISC-V单板计算机体验】星光 2 功耗测评

    ,具有更强大的图像处理能力,如能进行3D图像渲染。凭借其高性能和对OpenCL、OpenGL ES、Vulkan的支持,昉·惊鸿7110更智能,更高效。昉·惊鸿7110既能完成一系列复杂的图像/视频
    发表于 09-28 10:34

    什么是强制gpu渲染_强制渲染gpu有什么用

    本文主要介绍了gpu的定义、gpu工作原理、gpu功能作用及手机的强制进行GPU渲染的详细解释,最后介绍了强制
    发表于 01-05 17:13 7285次阅读

    GPU原理 GPU渲染流程

    GPU渲染流水线,是硬件真正体现渲染概念的操作过程,也是最终将图元画到2D屏幕上的阶段。GPU管线涵盖了渲染流程的几何阶段和光栅化阶段,但对
    发表于 04-27 11:33 9107次阅读
    <b class='flag-5'>GPU</b>原理 <b class='flag-5'>GPU</b><b class='flag-5'>渲染</b>流程

    GPU领跑运算性能,实现高性能计算新突破

    2018 全国高性能计算学术年会(HPC CHINA 2018)于10月20日在青岛闭幕。大会以“HPC+一切皆可计算”为主题,围绕高性能计算
    的头像 发表于 10-24 17:43 5079次阅读

    存储空间高性能计算的重要性

    对于很多有高性能计算需求的用户来说,通常比较关注的是计算的硬件配置是否是最新的,因为这往往关系到计算效率。但性能
    发表于 08-13 15:28 772次阅读

    中国首款高性能服务器级显卡GPU测试成功

    高性能图形GPU零的突破,大幅提升了国产GPU图形渲染能力,赋能新基建,在5G数据中心、元宇宙、云桌面、云游戏、云手机、信创桌面、工作站等应用领域将大放异彩。 作为智能
    的头像 发表于 11-18 09:09 1257次阅读
    中国首款<b class='flag-5'>高性能</b>服务器级显卡<b class='flag-5'>GPU</b>测试成功

    GPU加速高性能计算经典应用

    高性能计算(HPC)在重大科学发现的前沿基础科学研究领域已逐渐成为不可或缺的重要手段之一。从分子动力学模拟、生物制药、材料电子结构计算、材料模拟到生命科学,都离不开高性能
    的头像 发表于 05-24 09:13 2346次阅读

    如何将高性能计算和科学计算应用软件更好的部署到GPU计算平台

    NVIDIA 与智东西公开课共同策划推出「GPU 加速高性能计算(HPC)经典应用在线研讨会」。研讨会将聚焦经典高性能计算和科学
    的头像 发表于 05-27 09:53 1318次阅读

    一文详解CPU渲染GPU渲染之间的优劣

    CPU 渲染利用计算机的 CPU 来执行场景并将其渲染到接近完美。这也是执行渲染的更传统方式。然而,随着 GPU 的出现,基于
    的头像 发表于 03-08 14:50 1570次阅读

    思尔芯助力中微电自研高性能安全GPU芯片开发

    思尔芯(全称“上海思尔芯技术股份有限公司”)近日宣布,其全芯片原型验证解决方案成功协助中微电(全称“深圳中微电科技有限公司”)首款拥有自主知识产权的高性能桌面电脑GPU芯片——“南风一号”流片成功
    的头像 发表于 03-06 11:29 544次阅读
    思尔芯助力中微电自研<b class='flag-5'>高性能</b>安全<b class='flag-5'>GPU</b>芯片开发

    智慧渲染,通用为“先”——象帝先推动 “通用、好用、高性能、自主可控” GPU解决方案

    与发热的要求还很高。 象帝先专注于高性能通用图形处理器的开发,提供“通用、好用、高性能、自主可控”的GPU芯片与完整的软件驱动,同时积极推动生态系统的建立与发展。通过在桌面端与服务器端部署通用
    的头像 发表于 06-25 12:41 1185次阅读