WebGL渲染3D高斯泼溅模型

news2025/1/21 4:45:10

WebGL渲染3D高斯泼溅模型

原文:

GitHub - kishimisu/Gaussian-Splatting-WebGL: 3D Gaussian Splatting Renderer for WebGL

此外,一些基于webgpu,threejs渲染,以及和cesium集成的项目如下

GitHub - playcanvas/supersplat: 3D Gaussian Splat Editor GitHub -
MarcusAndreasSvensson/gaussian-splatting-webgpu
https://github.com/mkkellogg/GaussianSplats3D 🎉(很多项目基于该项目开发) GitHub -
tebben/cesium-gaussian-splatting: Test to see if we can get gaussian
splatting to work in CesiumJS (和cesium集成)
https://doc.babylonjs.com/features/featuresDeepDive/mesh/gaussianSplatting
(babylonjs渲染的官方api)
https://github.com/ebeaufay/threedtiles(以3dtiles的方式,加载3D高斯泼溅数据)

3维高斯模型基础

3维高斯函数控制形状

一维高斯函数,即为正态分布的曲线。形状由方差和均值控制。 在这里插入图片描述
在这里插入图片描述**
二维高斯函数,形状为一个突起面。

在这里插入图片描述

在这里插入图片描述

三维高斯函数,形状是一个椭球体(椭球面的积分),形状由协方差矩阵控制。旋转矩阵和缩放矩阵可以对高斯分布进行仿射变换,因此协方差矩阵可以用旋转和缩放矩阵进行表达。
在这里插入图片描述

在这里插入图片描述

3D高斯分布的协方差矩阵是一个对角矩阵。

当x y z都不相关的时候,此时椭球就是一个球。

球谐函数描述颜色

不同方向展示不同的颜色

和傅里叶级数性质类似,球谐函数也是以正交函数作为基底,傅里叶级数的正交基底为sin(nx)和cos(nx)。球谐函数则是球面上的正交基底。其主要性质有:

  • 标准正交性
  • 旋转不变性
  • 函数乘积的积分等于其球谐系数向量的点积

坐标系变换

四个坐标系

  • 世界坐标系
  • 相机坐标系
  • 归一化坐标系
  • 像素坐标系(屏幕空间)

四种变换

观测变换(世界坐标系到相机坐标系,相机的projmatrix)

剔除在相机空间深度值小于0.4的点

投影变换(正交投影或透视投影,得到一个范围为[-1,1]的正方体,所有点都在里面,即裁切空间。方便对渲染图元进行裁切)

float p_w = 1. / (p_hom.w + 1e-7);

vec3 p_proj = p_hom.xyz * p_w; // 裁切空间的点的坐标

视口变换(将[-1,1]的标准立方体变换到[0,height],[0,width]的屏幕空间中。使用二维协方差矩阵描述)

计算二维协方差矩阵

**lambda1** **和 lambda2**:这两个变量表示协方差矩阵的两个特征值。特征值描述了高斯分布的主轴方向上的方差大小

获取my_radius,矩形区域的半径

将裁切空间坐标转换为屏幕空间坐标

计算缩放比例

计算四个顶点

光栅化

根据四个顶点绘制三角形。用四边形近似描述高斯球。

WebGL中的模型

投影矩阵用于将世界空间坐标转换为剪裁空间坐标。常用的投影矩阵(透视矩阵)用于模拟充当 3D 虚拟世界中观看者的替身的典型相机的效果。

视图矩阵负责移动场景中的对象以模拟相机位置的变化,改变观察者当前能够看到的内容。

在 WebGL 程序中,数据通常上传到具有自己的坐标系统的 GPU 上,然后顶点着色器将这些点转换到一个称为裁剪空间的特殊坐标系上。延展到裁剪空间之外的任何数据都会被剪裁并且不会被渲染。如果一个三角形超出了该空间的边界,则将其裁切成新的三角形,并且仅保留新三角形在裁剪空间中的部分。

我们需要计算出高斯体在裁切空间中的坐标(四个角点的坐标,使用矩形描述二维高斯体)

数据加载与解析

解析二进制ply文件,每个点获取62个属性数据。

提取**{ positions, opacities, colors, cov3Ds }**,分别为位置、透明度、颜色、协方差矩阵。

Position**(位置信息):椭球的中心,也是高斯分布的均值**

Covariance**(协方差矩阵):次变量可以控制椭球的大小,形状和方向**

Opacity**(不透明度):用于控制不透明度,用于Splatting****时的渲染**

Spherical harmonics**(球谐函数):球谐函数,视角相关的外观颜色**

着色器

顶点着色器处理顶点数据并输出插值变量(基于每个实例的顶点属性,按照距离线性插值。如果顶点属性都相同,那么中间区域的点的属性也相同),这些变量在光栅化过程中被插值后传递给片段着色器。

片段着色器则根据这些插值变量和其他输入(如纹理、光照参数)计算每个片段的最终颜色。

顶点着色器输出4个顶点位置和矩形的插值位置变量,交给片段着色器。片段着色器根据高斯函数,计算不同位置的颜色和透明度。

splat_vertex.glsl 用于计算点的位置

splat_fragment.glsl 用于计算点的颜色

splat_vertex.glsl顶点着色器

输入:

in vec3 a_center; //三维向量,代表点云的中心位置

in vec3 a_col; //三维向量,代表点云的颜色

in float a_opacity; //一个浮点数,代表点云的不透明度

in vec3 a_covA; //三维向量,一共6个,用两个3维描述

in vec3 a_covB;

常量:

uniform float W; //窗口宽度

uniform float H; //窗口高度

uniform float focal_x; //代表x方向的焦距

uniform float focal_y; //代表y方向的焦距

uniform float tan_fovx; //代表x方向的视场角的正切值

uniform float tan_fovy; //代表y方向的视场角的正切值

uniform float scale_modifier; //用于缩放点云的大小

uniform mat4 projmatrix; //用于投影变换

uniform mat4 viewmatrix; //用于视图变换

输出:

// 在片段着色器中作为输入的变量

out vec3 col; // 颜色

out float depth; // 深度值

out float scale_modif; // 缩放因子

out vec4 con_o; // 协方差矩阵 + 不透明度

out vec2 xy; // 传递给片段着色器的点在屏幕空间中的位置

out vec2 pixf; // 传递给片段着色器的顶点在屏幕空间中的位置

计算步骤

第一步:观测变换+投影变换

l 世界坐标系 转换为 相机坐标系

l 相机坐标系 转换为 裁切空间坐标系

第二步:剔除距离相机过近的点

l 原始坐标系乘视图矩阵,坐标z值即为到相机的距离。小于0.4移除

第三步:计算二维协方差矩阵,获取二维高斯分布在屏幕空间的扩展范围

根据三维协方差矩阵、相机焦距、fov、视图矩阵,计算二维协方差矩阵。

cov.x 表示协方差矩阵的 [0][0] 元素(即 x 方向的方差)。
cov.y 表示协方差矩阵的 [0][1] 元素(即 x 和 y 方向的相关性)。
cov.z 表示协方差矩阵的 [1][1] 元素(即 y 方向的方差)。

计算二维协方差矩阵的逆

计算高斯分布的长轴长度和短轴长度
计算高斯分布的半径,即3倍长轴
计算高斯分布中心点的屏幕坐标

第三步:计算矩形的四个角点

vec2 screen_pos = point_image + my_radius * corner;

my_radius是矩形的边长(经过缩放后)

corner为 [-1,-1],[1,-1],[-1,1],[1,1]

point_image是矩形的中心点

每个矩形为二维高斯分布的扩展范围,可以覆盖99.7%的点。
在这里插入图片描述

splat_fragment.glsl片元着色器

输入:

in vec3 col; //三维向量,代表片段的颜色

in float scale_modif; //缩放高斯点云的大小

in float depth; //代表片段的深度值

in vec4 con_o; //四维向量,包含二维高斯分布的协方差矩阵信息

in vec2 xy; //二维向量,代表片段在图像坐标系中的位置

in vec2 pixf; //二维向量,矩形四个顶点的位置

输出:

out vec4 fragColor; //四维向量,表示片段的颜色和透明度

第一步:计算顶点和中心位置的偏移

vec2 d = xy - pixf;

计算三维高斯函数的指数项

float power = -0.5 * (con_o.x * d.x * d.x + con_o.z * d.y * d.y) - con_o.y * d.x * d.y;

注意:power值是的,power越小,距离中心越近。大于0的舍弃

即所绘制片段距离中心的距离

第二步:计算透明度

float alpha = min(.99f, con_o.w * exp(power));

大于0.9就默认为0.9,小于0.9,则计算透明度。

Power越小,exp(power)越大,alpha越大。即越远越透明。

第三步:丢弃透明度小的片段,绘制出椭圆

由float power = -0.5 * (con_o.x * d.x * d.x + con_o.z * d.y * d.y) - con_o.y * d.x * d.y;

float alpha = min(.99f, con_o.w * exp(power));

if (alpha < 1./255.) {

​ discard;

}
在这里插入图片描述

第四步:设置透明度,实现颜色过渡效果
fragColor = vec4(color, alpha);
在这里插入图片描述 fragColor = vec4(color * alpha, alpha);
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2279648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端:angular工程目录结构和相关文件学习

前端工程结构&#xff0c;angular&#xff1a; 环境变量文件说明&#xff1a; // The file contents for the current environment will overwrite these during build. // The build system defaults to the dev environment which uses environment.ts, but if you do // n…

Linux图形界面详解以及替换桌面程序方法[持续更新]

说明&#xff1a;本文章主要说明Linux图形界面的启动流程&#xff0c;以及使用自己的图形化应用替换桌面程序的方法&#xff0c;类似与安卓启动会启动Launcher&#xff0c;使用自己程序替换Launcher一样&#xff0c;实现应用独占系统&#xff0c;或者设计自己的桌面程序&#x…

异地IP属地代理业务解析:如何改变IP属地

在数字化时代&#xff0c;IP地址作为网络设备的唯一标识符&#xff0c;不仅关乎设备间的通信&#xff0c;还涉及到用户的网络身份与位置信息。随着互联网的深入发展&#xff0c;异地IP属地代理业务逐渐走进大众视野&#xff0c;成为许多用户关注的话题。本文将详细解析异地IP属…

网络安全VS数据安全

关于网络安全和数据安全&#xff0c;我们常听到如下两种不同声音&#xff1a; 观点一&#xff1a;网络安全是数据安全的基础&#xff0c;把当年做网络安全的那一套用数据安全再做一遍。 观点二&#xff1a;数据安全如今普遍以为是网络安全的延伸&#xff0c;实际情况是忽略数据…

Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来

引言 当我们手握智能手机&#xff0c;流畅地滑动屏幕、切换应用、欣赏动画时&#xff0c;背后其实藏着一套庞大且精密的开源系统——Android AOSP&#xff08;Android Open Source Project&#xff09;。这套系统不仅是所有安卓设备的根基&#xff0c;也是系统开发者的终极 pl…

day02_ElasticSearch基础和SeaTunnel

文章目录 day02_ElasticSearch基础和SeaTunnel一、ElasticSearch基本介绍(了解)1、Elasticsearch应用方向2、ElasticSearch特点3、发展历史二、安装ElasticSearch(操作)1、安装ElasticSearch2、插件安装2.1 浏览器安装可视化插件2.2 PyCharm安装Elasticsearch插件三、Elast…

AI 大爆发时代,音视频未来路在何方?

AI 大模型突然大火了 回顾2024年&#xff0c;计算机领域最大的变革应该就是大模型进一步火爆了。回顾下大模型的发展历程&#xff1a; 萌芽期&#xff1a;&#xff08;1950-2005&#xff09; 1956年&#xff1a;计算机专家约翰麦卡锡首次提出“人工智能”概念&#xff0c;标志…

OpenEuler学习笔记(三):为什么要搞OpenEuler?

为什么要搞OpenEuler&#xff1f; 技术自主可控需求 在信息技术领域&#xff0c;操作系统是关键的基础软件。过去&#xff0c;很多关键技术被国外厂商掌控&#xff0c;存在技术“卡脖子”的风险。OpenEuler的出现可以为国内提供一个自主可控的操作系统选择。例如&#xff0c;在…

linux下的NFS和FTP部署

目录 NFS应用场景架构通信原理部署权限认证Kerberos5其他认证方式 命令serverclient查看测试系统重启后自动挂载 NFS 共享 高可用实现 FTP对比一些ftp服务器1. **vsftpd (Very Secure FTP Daemon)**2. **ProFTPD (Professional FTP Daemon)**3. **Pure-FTPd**4. **WU-FTPD (Was…

STM32-keil安装时遇到的一些问题以及解决方案

前言&#xff1a; 本人项目需要使用到STM32,故需配置keil 5&#xff0c;在配置时遇到了以下问题&#xff0c;并找到相应的解决方案&#xff0c;希望能够为遇到相同问题的道友提供一些解决思路 1、提示缺少&#xff08;missing&#xff09;version 5编译器 step1&#xff1a;找…

mfc操作json示例

首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…

AI可信论坛亮点:合合信息分享视觉内容安全技术前沿

前言 在当今科技迅猛发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活与工作方式。作为AI领域的重要盛会&#xff0c;CSIG青年科学家会议AI可信论坛汇聚了众多青年科学家与业界精英&#xff0c;共同探讨AI技术的最新进展、挑…

调试Hadoop源代码

个人博客地址&#xff1a;调试Hadoop源代码 | 一张假钞的真实世界 Hadoop版本 Hadoop 2.7.3 调试模式下启动Hadoop NameNode 在${HADOOP_HOME}/etc/hadoop/hadoop-env.sh中设置NameNode启动的JVM参数&#xff0c;如下&#xff1a; export HADOOP_NAMENODE_OPTS"-Xdeb…

Ability Kit-程序框架服务(类似Android Activity)

文章目录 Ability Kit&#xff08;程序框架服务&#xff09;简介Stage模型开发概述Stage模型应用组件应用/组件级配置UIAbility组件概述概述声明配置 生命周期概述生命周期状态说明Create状态WindowStageCreate**和**WindowStageDestroy状态WindowStageWillDestroy状态Foregrou…

鸿蒙安装HAP时提示“code:9568344 error: install parse profile prop check error” 问题现象

在启动调试或运行应用/服务时&#xff0c;安装HAP出现错误&#xff0c;提示“error: install parse profile prop check error”错误信息。 解决措施 该问题可能是由于应用使用了应用特权&#xff0c;但应用的签名文件发生变化后未将新的签名指纹重新配置到设备的特权管控白名…

哈尔滨有双线服务器租用吗?

哈尔滨有双线服务器租用吗&#xff1f;双线服务器是一种针对哈尔滨特有的网络环境优化的服务器解决方案&#xff0c;它能够同时支持中国电信和中国联通或移动其中两家主要ISP&#xff08;互联网服务提供商&#xff09;的连接。 由于中国南方地区多采用电信网络&#xff0c;而北…

三天急速通关Java基础知识:Day1 基本语法

三天急速通关JAVA基础知识&#xff1a;Day1 基本语法 0 文章说明1 关键字 Keywords2 注释 Comments2.1 单行注释2.2 多行注释2.3 文档注释 3 数据类型 Data Types3.1 基本数据类型3.2 引用数据类型 4 变量与常量 Variables and Constant5 运算符 Operators6 字符串 String7 输入…

JVM 面试八股文

目录 1. 前言 2. JVM 简介 3. JVM 内存划分 3.1 为什么要进行内存划分 3.2 内存划分的核心区域 3.2.1 核心区域一: 程序计数器 3.2.2 核心区域二: 元数据区 3.2.3 核心区域三: 栈 3.2.4 核心区域四: 堆 4. JVM 类加载机制 4.1 类加载的步骤 4.1.1 步骤一: 加载 4…

《AI赋能中国制造2025:智能变革,制造未来》

引言&#xff1a;开启智能制造新时代 在全球制造业格局深度调整的当下&#xff0c;科技变革与产业转型的浪潮汹涌澎湃。2015 年&#xff0c;我国重磅推出《中国制造 2025》这一宏伟战略&#xff0c;它如同一座灯塔&#xff0c;为中国制造业驶向高端化、智能化、绿色化的彼岸指明…

Observability:最大化可观察性 AI 助手体验的 5 大提示(prompts)

作者&#xff1a;来自 Elastic Zoia_AUBRY 在过去三年担任客户工程师期间&#xff0c;我遇到了数百名客户&#xff0c;他们最常问的问题之一是&#xff1a;“我的数据在 Elastic 中&#xff1b;我该如何利用它获得最大优势&#xff1f;”。 如果这适用于你&#xff0c;那么本…