预过滤环境光贴图制作教程:第三阶段 - 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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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数据…