你再也找不到更詳細的3DGS教程了 —— 一萬九千字長文解析3DGS

參考:

https://www.bilibili.com/video/BV1MF4m1V7e3/

https://blog.csdn.net/2401_86810419/article/details/148811121

https://www.bilibili.com/video/BV1cz421872F?t=233.9

https://wuli.wiki/online/SphHar.html

https://zhuanlan.zhihu.com/p/467466131

特別指出的是SY__007的3DGS較真系列,對本文有極大的啟發和參考價值,下文有很多截圖也直接來自視頻,強烈推薦大家移步小破站,去觀看視頻。

做雪球?

What is splatting?

關于Splat,在英語中作拋雪球打擊到墻面的擬聲詞。

Splatting是一種體渲染的方法:將3D物體渲染到2D平面

與NeRF中的渲染方法的差異:

NeRF中使用Ray-casting(類似射線求積分):是計算像素點收到發光粒子的影響來生成圖像。

3DGS中使用Splatting這種主動的方法,計算發光粒子如何影響像素

Splatting算法的核心:

  1.選擇雪球

  2.拋擲雪球:從3D投影到2D,得到足跡(footprint)

  3.加以合成,得到最終的圖像

一:為什么使用核(雪球,Gaussian):

基于Gaussian的數學性質:

1.Gaussian本身是閉合的橢球,經過仿射變換后依舊是封閉的

2.高維Gaussian降維(沿某個軸進行積分)之后依舊是Gaussian

對于橢球Gaussian:

                                                          

其中x是三維空間中的點,

μ是高斯分布的均值向量,表示Gaussian的中心點位置

Σ是協方差矩陣,描述Gaussian在3D空間中的形狀和方向,它是半正定的

為什么這是一個橢球?

首先去了解 協方差矩陣。

對于Gauss分布:

一維:形狀由 均值&方差 決定

高維:形狀由 均值&協方差矩陣 決定

對于協方差矩陣:

                                                         

  1. 是一個對稱矩陣,決定高斯分布形狀

  2. 對角線上元素為x軸/y軸/z軸的方差

  3. 反斜對角線上的值為協方差,表示x和y,x和z........的線性相關程度

這里直接用SY__007寫的:

拋雪球

如何進行參數變換?

從3D->像素的過程:

觀測變換

觀測變換:從世界坐標系-->相機坐標系

投影變換

投影變換:正交投影 、透視投影

正交投影:

對于立方體[l,r]*[b,t]*[f,n]

1.平移到原點

2.立方體縮放至[-1,1]^3的正方體空間內

總的來說就是進行了仿射變換,

如題所給的例子的仿射變換即是:

M_{ortho}=AB

A這里是縮放矩陣

B為平移矩陣

在正交投影中,我們沒有考慮對于原本的長方體的長和寬的比例不同,導致的縮放比例不同,其實產生了畸變,這個問題會在之后的視口變換解決

透視投影:

透視投影需要滿足近大遠小的條件

對于視錐,我們先把他變換為‘立方體’,再進行正交投影

                          

數學過程實在懶得寫了,這里直接放上作者手稿一張

問題?:

透視投影是非線性的,也就是非放射變換,但是高斯橢球經過仿射變換后是高斯,但非仿射變換就不一定。

                                                      ???????

視口變換:

我們從簡化的圖形渲染管線開始:

3D 頂點 → 模型變換 → 視圖變換 → 投影變換 → 裁剪 → 標準化設備坐標 → 視口變換 → 屏幕像素

之前的變換已經將頂點從”模型局部坐標“轉換成NDC空間坐標,以OpenGL為例,正交投影下為[-1,1]×[-1,1]×[-1,1]

視口變換的目的就是把可見區域的標準化坐標,映射到顯示器的實際像素區域,讓圖形真正顯示在屏幕上。

視口變換的數學實現

核心是縮放+平移的組合,把NDC范圍映射到屏幕視口的像素范圍:

(1)以OpenGL經典的[-1.1]立方體為例(xy對應屏幕二維,z用于深度緩沖):

  • NDC的x范圍:x_{ndc}\in [-1,1]

  • NDC的y范圍:y_{ndc}\in [-1,1]

  • NDC的z范圍:z_{ndc}\in [-1,1](或者[0,1],這取決于深度緩沖裝置)

(2)目標視口的像素范圍

假設屏幕視口的:

  • 左下角像素坐標:(x0,y0)(比如窗口內視口偏移,或全屏時 (0,0))

  • 寬度:width(像素數,如 800 )、高度:height(像素數,如 600 )

  • 深度范圍(可選,用于深度緩沖):[zNear,zFar](比如 [0,255] 或浮點深度 )

(3)視口變換矩陣與公式

視口變換通過縮放矩陣+平移矩陣,實現對標準化坐標(x_{ndc},y_{ndc},z_{ndc}),變換后得到屏幕像素坐標(x_{vp},y_{vp},z_{vp})

                                      

用矩陣形式(齊次坐標下)可以表示為:

               

對于M_{viewport}進行拆解

1.縮放部分:

  • x方向:\frac{width}{2}把[-1,1]縮放為[0,width]范圍;

  • y方向:\frac{height}{2}把[-1,1]縮放為[0,height]范圍,但考慮到屏幕坐標系一般y軸"向下為上”(與NDC相反),所以使用(1-y_{ndc})反轉;

  • z方向:\frac{zFar-zNear}{2}把[-1,1]縮放為[zNear,zFar](深度緩沖的實際范圍)

2.平移部分

  • x 平移x0+\frac{width}{2},讓縮放后的 [0,width] 起點對齊視口左下角 x0;

  • y 平移 y0+\frac{height}{2},同理對齊視口左下角 y0;

  • z 平移zNear + \frac{zFar - zNear}{2} ,讓縮放后的深度對齊 zNear 起點。

視口變換的實際作用:
  • 從虛擬坐標到物理屏幕

  • 支持多視角渲染

  • 深度緩沖的落地

光柵化:

1.光柵化的位置:渲染管線‘矢量-->像素’轉換

簡單渲染管線流程為:

3D 頂點 → 變換(模型/視圖/投影)→ 裁剪 → 標準化設備坐標(NDC)→ 光柵化 → 像素著色 → 幀緩沖 → 屏幕

  • 前面的變換,把頂點轉成抽象的數學坐標(如NDC空間下的[-1,1]立方體)

  • 光柵化要解決:如何把這些矢量圖元拆解成屏幕上的離散像素,讓每個像素知道“屬于哪個圖元,該染什么顏色”

2.光柵化的核心任務:圖元的“離散化”

(1)輸入:圖元的“數學描述”

以三角形為例(圖形學的最基礎圖元,復雜模型由三角形拼接),輸入是三個頂點的坐標(NDC或視口變換后的屏幕坐標),以及頂點附帶的屬性(顏色、法向量、紋理坐標等)。

(2)輸出:像素的“歸屬與屬性”

輸出是覆蓋這些三角形的所有像素,并為每個像素插值計算屬性(比如/頂點顏色查指出像素顏色,紋理坐標插值出采樣位置),供后續像素著色器處理。

3.光柵化的關鍵步驟

(1)三角形 setup(配置)

計算三角形的邊方程和包圍盒

  • 先找出三角形在屏幕上的最小包圍矩形(AABB),只遍歷這個范圍內的像素,減少計算量;

  • 推導三角形三條邊的數學方程(如ax+by+c=0),用于判斷i像素是否在三角形內

(2)三角形traversal(遍歷)

  • 對包圍盒捏的每個像素(或'采樣點'),用便方程判斷是否在三角形內(比如OpenGL的“winding order”規則,或計算重心坐標)。

  • 若像素在三角形內,就標記為屬于該三角形,并進入屬性插值階段

(3)屬性插值

三角形三個頂點有屬性(如顏色C_0,C_1,C_2、紋理坐標

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/921825.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/921825.shtml
英文地址,請注明出處:http://en.pswp.cn/news/921825.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python,遺傳算法與神經網絡架構搜索:基于DEAP的自動模型設計

引言:當進化論遇見深度學習——自動化的黎明在深度學習的蠻荒時代,我們是“手工匠人”。我們依靠直覺、前輩的經驗(ResNet 為什么是152層而不是153層?)、大量的試錯以及那么一點點玄學,在架構的黑暗森林中摸…

Vue框架技術詳解——項目驅動概念理解【前端】【Vue】

Vue3框架 是前端渲染框架瀏覽器向服務器第一次發送請求,就會將所有頁面的樣式全部返回到瀏覽器vue中會將所有js文件最后打包成一個js文件,當前訪問其中一個頁面時,其他頁面的樣式也已經返回到瀏覽器中了,下次切換頁面時&#xff…

HTML 網頁靜態托管 API 接口文檔(可集成到智能體Agent)

HTML 網頁靜態托管 API 接口文檔(可集成到智能體Agent) 接口概述 本接口用于將HTML代碼轉換為可訪問的網頁,支持通過API密鑰進行身份驗證。 API 密鑰申請地址: https://www.cuobiezi.net/user/api_keys/apply API接口信息 接…

springboot vue sse消息推送,封裝系統公共消息推送前后端方法

概述 1、封裝springboot全局的消息推送接口; 注:1)由于原生HTML5 EventSource 不支持添加header,所以要把連接創建接口加入身份驗證白名單,并在接口內添加自己校驗token2)后臺需定時心跳,保證鏈…

LeetCode 每日一題 2025/9/1-2025/9/7

記錄了初步解題思路 以及本地實現代碼;并不一定為最優 也希望大家能一起探討 一起進步 目錄9/1 1792. 最大平均通過率9/2 3025. 人員站位的方案數 I9/3 3027. 人員站位的方案數 II9/4 3516. 找到最近的人9/5 2749. 得到整數零需要執行的最少操作數9/6 3495. 使數組元…

小迪安全v2023學習筆記(八十講)—— 中間件安全WPS分析WeblogicJenkinsJettyCVE

文章目錄前記服務攻防——第八十天中間件安全&HW2023-WPS分析&Weblogic&Jetty&Jenkins&CVE應用WPS - HW2023-RCE&復現&上線CS介紹漏洞復現中間件 - Weblogic-CVE&反序列化&RCE介紹利用中間件 - Jenkins-CVE&RCE執行介紹漏洞復現CVE-20…

各webshell管理工具流量分析

哥斯拉哥斯拉是一個基于流量、HTTP全加密的webshell管理工具 特點 1.內置了3種Payload以及6種加密器,6種支持腳本后綴,20個內置插件 2.基于java,可以跨平臺使用 3.可以自己生成webshell,根據管理來生成一些payload,然后…

pytest(1):fixture從入門到精通

pytest(1):fixture從入門到精通前言1. Fixture 是什么?為什么我們需要它?2. 快速上手:第一個 Fixture 與基本用法3. 作用域 (Scope):控制 Fixture 的生命周期4. 資源管理:Setup/Tear…

Java17 LTS 新特性用例

基于 Java 17 LTS 的 實用示例 以下是基于 Java 17 LTS 的 30 個實用示例,涵蓋語言新特性、API 改進及常見場景。所有代碼均兼容 Java 17 語法規范。 文本塊(Text Blocks) String json = """{"name": "Java 17","type": &qu…

SpringBoot-Web開發-內容協商——多端內容適配內容協商原理HttpMessageConverter

其它篇章: 一:SpringBoot3-日志——日志原理&日志格式&日志級別&日志分組&文件輸出&文件歸檔&滾動切割 二:SpringBoot3-Web開發-靜態資源——WebMvcAutoConfiguration原理&資源映射&資源緩存&歡迎頁&…

Spring MVC 類型轉換與參數綁定:從架構到實戰

在 Spring MVC 開發中,“前端請求數據” 與 “后端 Java 對象” 的格式差異是高頻痛點 —— 比如前端傳的String類型日期(2025-09-08)要轉成后端的LocalDate,或者字符串male要轉成GenderEnum.MALE枚舉。Spring 并非通過零散工具解…

Spark提交任務的資源配置和優化

Spark 提交任務時主要可調的資源配置參數包括 Driver 資源(內存、CPU)、Executor 資源(數量、內存、CPU)以及 集群管理相關參數。配置和優化時一般結合集群硬件資源、數據規模、作業類型和作業復雜度(SQL / 機器學習&a…

機器學習06——支持向量機(SVM核心思想與求解、核函數、軟間隔與正則化、支持向量回歸、核方法)

上一章:機器學習05——多分類學習與類別不平衡 下一章:機器學習07——貝葉斯分類器 機器學習實戰項目:【從 0 到 1 落地】機器學習實操項目目錄:覆蓋入門到進階,大學生就業 / 競賽必備 文章目錄一、間隔與支持向量&…

AI集群全鏈路監控:從GPU微架構指標到業務Metric關聯

點擊 “AladdinEdu,同學們用得起的【H卡】算力平臺”,H卡級別算力,80G大顯存,按量計費,靈活彈性,頂級配置,學生更享專屬優惠。 引言:AI算力時代的監控挑戰 隨著深度學習模型規模的指…

K8s Ingress Annotations參數使用指南

Kubernetes Ingress Annotations 是與特定 Ingress 控制器(如 Nginx、Traefik、HAProxy 等)配合使用,用于擴展和定制 Ingress 資源行為的關鍵配置項。它們通常以鍵值對的形式添加在 Ingress 資源的 metadata部分。Ingress Annotations參數速查…

CodeBuddy Code深度實戰:從零構建智能電商推薦系統的完整開發歷程

項目背景與挑戰作為一名有著多年全棧開發經驗的技術人員,我最近接手了一個具有挑戰性的項目:為某中型服裝電商平臺開發一套智能商品推薦系統。該系統需要在2個月內完成,包含以下核心功能:前端:React TypeScript構建的…

Day 19: 算法基礎與面試理論精通 - 從思想理解到策略掌握的完整體系

Day 19: 算法基礎與面試理論精通 - 從思想理解到策略掌握的完整體系 ?? 課程概述 核心目標:深度理解算法設計思想和核心原理,掌握面試高頻算法概念,建立完整的算法知識體系 學習重點: ? 核心數據結構的本質理解和應用場景分析 ? 經典算法設計模式的思想精髓和解題策…

AI與AR融合:重塑石化與能源巡檢的未來

在石化企業和新能源電站的巡檢工作中,傳統模式正被一場技術革命所顛覆。AI與AR( www.teamhelper.cn )的深度融合,不僅提升了巡檢效率,更將巡檢工作從被動響應轉變為預測預防,開啟了智能運維的新篇章。一、透…

滴滴二面(準備二)

手寫防抖函數并清晰闡述其價值,確實是前端面試的常見考點。下面我將為你直接呈現防抖函數的代碼,并重點結合滴滴的業務場景進行解釋,幫助你向面試官展示思考深度。 這是防抖函數的一個基本實現,附帶注釋以便理解: func…

Kubernetes(四):Service

目錄 一、定義Service 1.1 typeClusterIP 1.2 typeNodePort 1.3 typeLoadBalancer 1.4 typeExternalName 1.5 無標簽選擇器的Service 1.6 Headless Service 二、Kubernetes的服務發現 2.1 環境變量方式 2.2 DNS方式 Kubernetes 中 Service 是 將運行在一個或一組 Pod 上的應用…