3D Gaussian Splatting 代码层理解之Part3

最后,内容到达了高斯泼溅过程中最有趣的阶段:渲染!这一步可以说是最关键的,因为它决定了模型的真实性。然而,它也可能是最简单的。在本系列的Part 1和Part2,文章演示了如何将 Raw 3D椭球 转换为可渲染的格式,但现在我们实际上必须完成这项工作并渲染到一组固定的像素上。作者使用 CUDA 开发了一个快速渲染引擎,这可能有点难以理解。因此,首先浏览 Python 中的代码是有益的,为了清晰起见,使用简单的 for 循环。对于那些渴望深入了解的人来说,所有必要的代码都可以在我们的 GitHub上找到。

继续讨论如何渲染每个单独的像素。从上一篇文章中,我们有了所有必要的组件:2D 点、相关颜色、协方差、排序深度顺序、2D 中的逆协方差、每个 splat 的最小和最大 x 和 y 值以及相关的不透明度。有了这些组件,就可以渲染任何像素。对于给定特定的像素坐标,我们按照相对于相机平面的泼溅深度顺序(投影到相机平面,然后按深度排序)遍历所有泼溅,直到达到饱和阈值。对于每个 splat,我们首先检查像素坐标是否在最小和最大 x 和 y 值定义的边界内。此检查确定我们是应该继续渲染还是忽略这些坐标的 splat。接下来,我们使用 splat 均值、splat 协方差和像素坐标计算像素坐标处的高斯 splat 强度。

def compute_gaussian_weight(pixel_coord: torch.Tensor,  # (1, 2) tensorpoint_mean: torch.Tensor,inverse_covariance: torch.Tensor,
) -> torch.Tensor:difference = point_mean - pixel_coordpower = -0.5 * difference @ inverse_covariance @ difference.Treturn torch.exp(power).item()

我们将此权重乘以 splat 的不透明度,以获得一个名为 alpha 的参数。在将此新值添加到像素之前,我们需要检查是否已超过饱和度阈值。如果像素已经饱和,我们不希望其他 splat 后面的 splat 影响像素着色并使用计算资源。因此,这里使用一个阈值,允许我们在超过该阈值时停止渲染。在实践中,我们从 1 开始将饱和阈值乘以 min(0.99, (1 — alpha))  得到一个新值。如果此值小于阈值 (0.0001),我们将停止渲染该像素并认为它已完成。如果没有,我们将添加由saturation * (1 — alpha)值加权的颜色,并将饱和度更新为 new_saturation = old_saturation * (1 — alpha)。最后,我们遍历每个像素(或实际中的每个 16x16 图块)并进行渲染。完整的代码如下所示。

def render_pixel(self,pixel_coords: torch.Tensor,points_in_tile_mean: torch.Tensor,colors: torch.Tensor,opacities: torch.Tensor,inverse_covariance: torch.Tensor,min_weight: float = 0.000001,) -> torch.Tensor:total_weight = torch.ones(1).to(points_in_tile_mean.device)pixel_color = torch.zeros((1, 1, 3)).to(points_in_tile_mean.device)for point_idx in range(points_in_tile_mean.shape[0]):point = points_in_tile_mean[point_idx, :].view(1, 2)weight = compute_gaussian_weight(pixel_coord=pixel_coords,point_mean=point,inverse_covariance=inverse_covariance[point_idx],)alpha = weight * torch.sigmoid(opacities[point_idx])test_weight = total_weight * (1 - alpha)if test_weight < min_weight:return pixel_colorpixel_color += total_weight * alpha * colors[point_idx]total_weight = test_weight# in case we never reach saturationreturn pixel_color

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

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

相关文章

【Bluedroid】A2dp初始化流程源码分析

一、概述 Bluedroid是Android系统中用于蓝牙通信的底层协议栈,它支持多种蓝牙协议,包括A2DP(Advanced Audio Distribution Profile,高级音频分发协议)。A2DP主要用于通过蓝牙传输高质量音频,如立体声音乐。以下是Bluedroid中A2DP初始化的基本流程。 1.1. 启动Bluetooth…

Mac上详细配置java开发环境和软件(更新中)

文章目录 概要JDK的配置JDK下载安装配置JDK环境变量文件 Idea的安装Mysql安装和配置Navicat Premium16.1安装安装Vscode安装和配置Maven配置本地仓库配置阿里云私服Idea集成Maven 概要 这里使用的是M3型片 14.6版本的Mac 用到的资源放在网盘 链接: https://pan.baidu.com/s/17…

[⑧5G NR]: PBCH payload生成

本篇博客记录下5G PBCH信道中payload数据的生成方式。PBCH payload一共32个比特&#xff0c;基本结构如下图&#xff1a; 根据SSB PDU中bchPayloadFlag的值有三种方式得到PBCH payload。 bchPayloadFlag 0&#xff1a;全部32比特由MAC层提供。 bchPayloadFlag 1&#xff1a;M…

预处理(1)(手绘)

大家好&#xff0c;今天给大家分享一下编译器预处理阶段&#xff0c;那么我们来看看。 上面是一些预处理阶段的知识&#xff0c;那么明天给大家讲讲宏吧。 今天分享就到这里&#xff0c;谢谢大家&#xff01;&#xff01;

IP地址查询——IP归属地离线库

自从网络监管部门将现实IP地址列入监管条例&#xff0c;IP地址的离线库变成网络企业发展业务的不可或缺的一部分&#xff0c;那么IP地址离线库是什么&#xff0c;又能够给我们带来什么呢&#xff1f; 什么是IP地址离线库&#xff1f; IP地址离线库是IP地址服务商将通过各种合…

EEG+EMG学习系列 (2) :实时 EEG-EMG 人机界面的下肢外骨骼控制系统

[TOC]( EEGEMG学习系列(2):实时 EEG-EMG 人机界面的下肢外骨骼控制系统) 论文地址&#xff1a;https://ieeexplore.ieee.org/abstract/document/9084126 论文题目&#xff1a;Real-Time EEG–EMG Human–Machine Interface-Based Control System for a Lower-Limb Exoskeleton …

C# 如何动态加载程序集

程序集的加载&#xff0c;默认是从当前目录下查找&#xff0c;如果当前目录查找不到&#xff0c;然后再去系统目录中查找&#xff0c;依然查找不到就会从环境变量中查找&#xff0c;如果依然找不到&#xff0c;则会抛出一个异常 FileNotFoundException。 托管代码中&#xff0…

深入理解 SQL_MODE 之 ANSI_QUOTES

引言 在 MySQL 数据库中&#xff0c;sql_mode 是一个重要的配置参数&#xff0c;它定义了 MySQL 应该遵循的 SQL 语法标准以及数据验证规则。其中&#xff0c;ANSI_QUOTES 是 sql_mode 中的一个重要选项&#xff0c;它改变了 MySQL 对于字符串和标识符的识别方式&#xff0c;使…

mac终端使用pytest执行iOS UI自动化测试方法

1、安装pytest-repeat插件&#xff1a; pip install pytest-repeat 2、安装allure-pytest插件&#xff1a; pip install allure-pytest 3、打开终端&#xff1a; pytest -q -s -ra --count100 test_open_stream.py --alluredir./report/CXL -q&#xff1a;表示“quiet mo…

用指针遍历数组

#include<stdio.h> int main() {//定义一个二维数组int arr[3][4] {{1,2,3,4},{2,3,4,5},{3,4,5,6},};//获取二维数组的指针int (*p)[4] arr;//二维数组里存的是一维数组int[4]for (int i 0; i < 3; i){//遍历一维数组for (int j 0; j <4; j){printf("%d &…

动态规划子数组系列(二) 环形子数组的最大和

题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int maxSubarraySumCircular(int[] nums) {int sum 0;int n nums.length;int[] f new int[n1];int[] g new int[n1];int ret 0, fmax -0x3f3f3f3f, gmin Integer.MAX_VALUE;for(int i 1; i < n; i)…

怎么用VIM查看UVM源码

利用ctags工具可以建立源码的索引表&#xff0c;在使用VIM或其他文本编辑器时&#xff0c;就可以跳转查看所调用的UVM或VIP的funtcion/task/class等源码了。 首先需要确认ctags安装&#xff0c;一般安装VIM后都有&#xff0c;如果没有可以手动安装。在VIM中可以输入:help ctag…

XXL-API v1.2.0 发布 | API管理平台

Release Notes 1、【新增】容器化&#xff1a;提供官方docker镜像&#xff0c;并实时更新推送dockerhub&#xff0c;进一步实现产品开箱即用&#xff1b;2、【优化】Docker基础镜像切换&#xff0c;精简镜像&#xff1b;降低资源消耗、提升部署效率&#xff1b;3、【优化】精简…

R语言数据分析可视化——summarytools包的使用

R语言中的summarytools包通过提供能够用最少的代码生成数据全面摘要的功能,使数据分析更加简单。summarytools包提供了一种简单的方法来生成数据集的摘要统计信息,包括描述性统计、频率表、交叉表、缺失值、异常值、相关性、线性回归、ANOVA、卡方检验等。本文将介绍如何使用…

element ui 搜索框中搜索关键字标红展示

示例如图 el-select上绑定remote-method属性 <el-select v-model"checkForm.type" filterable remote reserve-keyword :remote-method"remoteMethod" :loading"loading"><el-option v-for"item in options" :key"ite…

OceansGallerie趣味游戏:带领Web2用户无缝融入Web3世界

引言 随着区块链技术的飞速发展&#xff0c;Web3生态正在逐渐成为数字世界的核心。然而&#xff0c;对于全球10亿Web2用户来说&#xff0c;区块链和Web3的概念依然晦涩难懂。OceansGallerie平台通过设计一个趣味性和奖励性的休闲游戏模块&#xff0c;旨在为这些用户提供一个简…

LeetCode654.最大二叉树

LeetCode刷题记录 文章目录 &#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码 &#x1f4dc;题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子…

MySQL EXPLAIN,数据库调优的秘密通道

EXPLAIN 是 MySQL 中一个非常有用的工具&#xff0c;它用于分析 SQL 查询的执行计划。通过 EXPLAIN&#xff0c;你可以获取 MySQL 是如何准备执行你的 SQL 语句的&#xff0c;包括使用的索引、连接类型、扫描的行数等信息。这些信息对于优化查询性能、识别性能瓶颈至关重要。 使…

uniapp vue里按钮上的文字,换行的方法,用rich-text

<rich-text class"caption-1" v-if"voiceTis 识别中...点击停止" v-html"formattedVoiceTis"></rich-text> <text class"caption-1" v-else>{{ formattedVoiceTis }}</text&g…

为什么hbase在大数据领域渐渐消失

HBase 曾是大数据存储领域的标杆之一,凭借其强大的分布式、列式存储和高扩展性,广泛应用于电商、社交网络、金融等需要海量数据管理的场景。然而,近年来 HBase 的使用确实在减少,这主要是因为数据技术栈的演变和用户需求的变化。以下是一些主要原因: 1. 复杂的运维和管理…