預過濾環境光貼圖制作教程:第三階段 - GGX 分布預過濾

核心目標

GGX 分布是 PBR 中模擬粗糙表面高光反射的主流模型,其核心是通過統計分布描述微表面的朝向概率。本階段的目標是:

  1. 基于第一階段生成的環境圖集,預計算 6 個級別的 GGX 過濾結果(對應不同粗糙度);
  2. 使用蒙特卡洛采樣(Monte Carlo Sampling)加速 GGX 卷積計算;
  3. 將預過濾結果存儲在環境圖集的指定區域,與 Stage 1 的基礎數據形成完整的環境數據集合。

這些預計算數據將使實時渲染時無需動態計算復雜的 GGX 卷積,只需直接采樣即可獲得符合物理規律的高光反射顏色。

準備工作

  • 前置條件:已完成 Stage 1,獲得包含基礎環境數據的envAtlas
  • 輸入資源:sourceCube(原始立方體貼圖)、envAtlas(待寫入預過濾結果的圖集);
  • 工具依賴:Three.js 環境(rendererscenecamera)、樣本生成工具(SampleGenerator);
  • 理論基礎:了解 GGX 分布模型、蒙特卡洛采樣、PBR 高光反射原理。

GGX 分布與預過濾原理

在 PBR 中,表面的高光反射效果由微表面分布函數(NDF) 決定,GGX 是其中應用最廣泛的模型,其分布函數為:

對于環境光反射,需要對整個環境貼圖按 GGX 分布進行卷積(加權平均),得到該粗糙度下的 “模糊” 環境貼圖。由于實時計算這一卷積成本極高,我們通過預計算(離線完成)并存儲結果,實時渲染時直接采樣,大幅提升性能。

實現步驟詳解

步驟 1:明確圖集存儲區域

預過濾結果將存儲在envAtlas的另一部分區域,與上階段的基礎數據分區存放。以 512x512 圖集為例,布局如下:

級別(i) 對應粗糙度 圖集內位置(x,y) 分辨率(寬 x 高) specularPower(高光強度)
1 (0, 256*s) 256x128 512
2 中低 (0, 256s + 128s) 128x64 128
3 (0, 256s + 128s + 64*s) 64x32 32
4 中高 ... 32x16 8
5 ... 16x8 2
6 極高 ... 8x4 1

  • 級別遞增對應粗糙度遞增(specularPower遞減);
  • 分辨率隨級別遞增減半(與 Stage 1 邏輯一致,粗糙度越高,所需細節越少)。

步驟 2:頂點著色器(UV 坐標處理)

與 Stage 1 類似,頂點著色器負責傳遞調整后的 UV 坐標,支持接縫處理:

uniform vec4 uvMod;  // UV調整參數:(scaleU, scaleV, offsetU, offsetV)
varying vec2 vUv;    // 傳遞給片段著色器的UVvoid main() {// 標準頂點變換:投影到裁剪空間gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);// 計算UV:擴展范圍以包含接縫像素vUv = (position.xy * 0.5 + 0.5) * uvMod.xy + uvMod.zw;
}

  • 復用 Stage 1 的 UV 擴展邏輯,通過uvMod確保渲染內容包含接縫像素,避免邊緣采樣誤差。

步驟 3:片段著色器(GGX 預過濾核心邏輯)

片段著色器是本階段的核心,實現基于蒙特卡洛采樣的 GGX 卷積計算,包含樣本解碼、方向轉換、立方體貼圖采樣等關鍵步驟。

3.1 基礎變量與常量
precision highp float;
varying vec2 vUv;                  // 頂點傳遞的UV
uniform samplerCube sourceCube;    // 原始立方體貼圖
uniform sampler2D samplesTex;      // 預生成的GGX樣本紋理
uniform vec2 samplesTexInverseSize;// 樣本紋理尺寸的倒數(用于計算UV)
uniform vec4 params;               // [_, specularPower, 接縫縮放系數, _]
const float PI = 3.141592653589793;
const int NUM_SAMPLES = 1024;      // 每個像素的采樣數量(平衡質量與性能)
3.2 RGBP 編碼(復用 Stage 1 邏輯)

預過濾結果仍采用 RGBP 編碼存儲,確保 HDR 數據高效壓縮:

vec4 encodeRGBP(vec3 source) {vec3 gamma = pow(source, vec3(0.5));  // gamma校正(平方根)float maxVal = min(8.0, max(1.0, max(gamma.x, max(gamma.y, gamma.z))));  // 限制最大范圍float v = 1.0 - ((maxVal - 1.0) / 7.0);  // 編碼縮放因子v = ceil(v * 255.0) / 255.0;  // 確保8位精度存儲return vec4(gamma / (-v * 7.0 + 8.0), v);  // 縮放顏色并返回
}
3.3 方向計算與接縫處理(復用與擴展)

與 Stage 1 相同,需將等矩形 UV 轉換為三維方向向量,并處理立方體貼圖接縫:

// 球坐標轉三維方向向量
vec3 fromSpherical(vec2 uv) {return vec3(cos(uv.y) * sin(uv.x),  // x分量sin(uv.y),              // y分量cos(uv.y) * cos(uv.x)   // z分量);
}// 從等矩形UV計算方向向量(指向環境中的采樣點)
vec3 getDirectionEquirect() {// 轉換UV范圍至球坐標:U→[-π,π],V→[π/2,-π/2](翻轉V軸)vec2 spherical = (vec2(vUv.x, 1.0 - vUv.y) * 2.0 - 1.0) * vec2(PI, PI * 0.5);return fromSpherical(spherical);
}// 調整方向向量以減輕立方體貼圖接縫
vec3 modifySeams(vec3 dir, float scale

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

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

相關文章

Spring框架與AutoCAD結合應用

什么是AutoCAD? AutoCAD簡介 AutoCAD是由美國Autodesk公司開發的計算機輔助設計(CAD)軟件,廣泛應用于建筑、工程、制造、產品設計等領域。它支持2D繪圖和3D建模,提供精確的圖形工具和自動化功能,幫助用戶高效創建技術圖紙和模型。 主要功能 2D繪圖:提供直線、圓弧、多…

Java 學習筆記:常用類、String 與日期時間處理

作為一名名 Java 初學者,最近在學習過程中整理了一些關于常用類、String 類以及日期時間處理的知識點。這些內容是 Java 基礎中的重點,也是日常編程練習中頻繁用到的工具,掌握它們能讓我們在寫代碼時更加得心應手。今天把這些筆記分享出來&am…

Android常用的adb和logcat命令

ADB ADB,即 Android Debug Bridge 是一種允許模擬器或已連接的 Android 設備進行通信的命令行工具,它可為各種設備操作提供便利,如安裝和調試應用,并提供對 Unix shell(可用來在模擬器或連接的設備上運行各種命令&…

重學JS-001 --- JavaScript算法與數據結構(一)JavaScript 基礎知識

文章目錄 變量 變量命名規則 變量命名 let vs const 變量使用范圍 賦值 = 控制臺輸出 運算符 ++ -- == === !== 注釋 轉義字符 數據類型 7種 原始數據類型 1. string?? 2. number?? 3. ??boolean?? 4. null?? 5. undefined?? 6. ??symbol??(ES6 新增) 7. big…

MySQL數據閃回工具my2sql的使用

場景: 當你或者其它人員誤操作數據庫不小心刪除或者更新了一批數據,但是是當時又沒事先備份時,你可以 用這個 my2sql工具快速幫你找回數據。就是如此的絲滑。但是要注意的是只限于dml語句,所以我們在操作數據庫前必需先備份哦&…

9.1無法恢復的錯誤與 panic!

無法恢復的錯誤與 panic! 有時你的代碼中會發生嚴重問題,而你無能為力。在這些情況下,Rust 提供了 panic! 宏。實際上,有兩種方式會導致 panic:一種是執行某個操作使代碼產生 panic(例如訪問數組越界)&…

分享低功耗單火線開關語音識別方案

在眾多老舊建筑和常規家居環境里,單火線布線是主流方式。單火線語音識別芯片方案通過研發和應用特殊的單火線語音識別芯片,實現設備在單火線供電條件下穩定運行,并精準識別語音指令,為智能家居、智能照明等領域帶來便捷的語音控制…

如何在Windows操作系統上通過conda 安裝 MDAnalysis

MDAnalysis 是一個開源的 Python 庫,旨在提供一個高效且靈活的方式來分析和處理分子動力學(MD)模擬數據。它可以從不同的文件格式中讀取模擬軌跡和結構數據,進行復雜的數據處理和分析,廣泛應用于生物物理學、化學、材料科學等領域。 一、創建虛擬環境 為了能夠順利安裝,減…

實用PDF演示解決方案

它打破了傳統閱 讀模式,讓PDF文檔也能像PPT一樣流暢播放,特別適合匯報、講解等展示場景。它是綠色單文件版,無需安裝,雙擊紅色圖標即點即用。運行后第一件事,建議把界面語言切換成中文,操作更順手。導入PDF…

VS Code中如何關閉Github Copilot

點擊頂部搜索欄后面的Copilot圖標,在下拉菜單中選擇Hide Copilot。在彈出的提示框中,點擊Hide Copilot按鈕就可以了。

MySQL學習從零開始--第六部分

Binlog是什么?有哪幾種格式?推薦使用哪種,為什么 Binlog是什么 Binlog二進制日志是MySQL Server層記錄所有更改數據庫內容的操作日志的二進制文件,如操作UPDATE,DELETE,INSERTBinlog不記錄SELECT,SHOW等查詢操作使主從…

走進computed,了解computed的前世今生

computed(計算屬性)并不是vue獨創的,而是源自計算機科學和響應式編程的長期發展 計算理論的奠基: 函數式編程的純函數思想:計算屬性的核心特征(無副作用、依賴輸入確定輸出)直接來源于函數式編程…

Java 23 新特性解析與代碼示例

Java 23 新特性解析與代碼示例 文章目錄Java 23 新特性解析與代碼示例1. 引言2. 正式特性2.1. Markdown文檔注釋 (JEP 467)2.2. 廢棄sun.misc.Unsafe的內存訪問方法以移除 (JEP 471)2.3. ZGC:默認啟用代際模式 (JEP 474)3. 預覽特性3.1. 原始類型在模式、instanceof…

spring boot + mybatis + mysql 只有一個實體類的demo

使用MyBatis進行數據庫操作,配置簡單。主要演示了mybatis可以不用只使用方法名來對應mapper.java和mapper.xml。 目錄結構 pom.xml src/ ├── main/ │ ├── java/ │ │ └── com/ │ │ └── springbootjdbcweb/ │ │ └── …

iRemovalPro完美繞iCloud插卡打電話,A12+支持iOS 18.1.1

iRemovalPro 專業工具全解析與操作指南 (支持iOS 14.0 - 16.6.1,A7-A15芯片設備) 👉下載地址見文末 iRemoval Pro iRemoval 專業版是一款來自外國安全研究員的工具,用來幫助一些人因為忘記自己的ID或者密碼&#xff0c…

安卓SELinux策略語法

目錄前言一、 通用AV規則語法1.1 allow source target:class permissions;1.2 neverallow source target:class permissions;二、type三、attribute四、typeattribute五、alias六、typealias七、init_daemon_domain7.1 init_daemon_domain 宏概述7.2 宏展開與實現7.2.1 展開后規…

vscode cursor配置php的debug,docker里面debug

VSCode PHP調試配置指南 概述 本文介紹如何在VSCode中配置PHP調試環境,包括本地和Docker環境。 前置要求 VSCodePHP 7.0Xdebug擴展PHP Debug VSCode擴展 本地調試配置 1. 安裝Xdebug # Ubuntu/Debian sudo apt-get install php-xdebug# MacOS brew install p…

elk部署加日志收集

清華大學鏡像源地址:Index of /elasticstack/8.x/yum/8.13.2/ | 清華大學開源軟件鏡像站 | Tsinghua Open Source Mirror 一、elasticsearch 1.安裝 rpm -ivh elastic-agent-8.13.2-x86_64.rpm 2.修改配置 vim /etc/elasticsearch/elasticsearch.yml 修改如下&…

dify 升級1.7.1 插件無法下載依賴

dify 升級1.7.1 插件無法下載依賴 1. 安裝通義千問插件,各種報錯; 使用下面命令查看docker 鏡像日志 docker logs -f --tail100 docker-plugin_daemon-1 2025/08/01 07:42:21 full_duplex.go:59: [INFO]init environment for plugin langgenius/tongyi…

linux中簡易云盤系統項目實戰:基于 TCP協議的 Socket 通信、json數據交換、MD5文件區別與多用戶文件管理實現

📋 項目介紹 本項目是一個基于Linux環境的簡易云盤系統,采用C/S(客戶端/服務器)架構,實現了類似百度網盤的基本功能。系統通過TCP Socket進行網絡通信,使用JSON格式進行數據交換,利用SQLite3數據…