IBL-镜面反射(LUT篇)

news2024/11/24 22:51:46

1. LUT需要求解什么

首先我们将镜面反射部分的积分分割为两个部分。
L o ( p , ω o ) = ∫ Ω L i ( p , ω i ) d ω i ∗ ∫ Ω f r ( p , ω i , ω o ) n ⋅ ω i d ω i L_{o}\left(p, \omega_{o}\right)=\int_{\Omega} L_{i}\left(p, \omega_{i}\right) d \omega_{i} * \int_{\Omega} f_{r}\left(p, \omega_{i}, \omega_{o}\right) n \cdot \omega_{i} d \omega_{i} Lo(p,ωo)=ΩLi(p,ωi)dωiΩfr(p,ωi,ωo)nωidωi
第一部分的积分即为预滤波,将所有照到该像素点的光照求积分。
∫ Ω L i ( p , ω i ) d ω i \int_{\Omega} L_{i}\left(p, \omega_{i}\right) d \omega_{i} ΩLi(p,ωi)dωi
第二部分需要我们知道,这个半球的光线照过来之后,有多少反射到了 ω i \omega_{i} ωi 所在的方向。

L U T LUT LUT 求解的便是,在夹角 c o s θ = N ⋅ ω i cos\theta = N\cdot \omega_{i} cosθ=Nωi,粗糙度为 r o u g h n e s s roughness roughness 下, B R D F BRDF BRDF 的积分是多少。
即,输入为
( N ⋅ V , r o u g h n e s s ) (N\cdot V , roughness) (NV,roughness)
输出为
∫ Ω f r ( p , ω i , ω o ) n ⋅ ω i d ω i \int_{\Omega} f_{r}\left(p, \omega_{i}, \omega_{o}\right) n \cdot \omega_{i} d \omega_{i} Ωfr(p,ωi,ωo)nωidωi

= ∫ Ω D F G 4 ( ω o ⋅ n ) ( ω i ⋅ n ) n ⋅ ω i d ω i = \int_{\Omega} \frac{D F G}{4\left(\omega_{o} \cdot n\right)\left(\omega_{i} \cdot n\right)} n \cdot \omega_{i} d \omega_{i} =Ω4(ωon)(ωin)DFGnωidωi

= ∫ Ω D G 4 ( ω o ⋅ n ) ( ω i ⋅ n ) ( F 0 + ( 1 − F 0 ) ( 1 − ω o ⋅ h ) 5 ) n ⋅ ω i d ω i =\int_{\Omega} \frac{D G}{4\left(\omega_{o} \cdot n\right)\left(\omega_{i} \cdot n\right)} \left(F_{0}+\left(1-F_{0}\right)\left(1-\omega_{o} \cdot h\right)^{5}\right) n \cdot \omega_{i} d \omega_{i} =Ω4(ωon)(ωin)DG(F0+(1F0)(1ωoh)5)nωidωi

= F 0 ∫ Ω D G 4 ( ω o ⋅ n ) ( ω i ⋅ n ) ( 1 − ( 1 − ω o ⋅ h ) 5 ) n ⋅ ω i d ω i + ∫ Ω D G 4 ( ω o ⋅ n ) ( ω i ⋅ n ) ( 1 − ω o ⋅ h ) 5 n ⋅ ω i d ω i = F_{0} \int_{\Omega} \frac{D G}{4\left(\omega_{o} \cdot n\right)\left(\omega_{i} \cdot n\right)} \left(1-\left(1-\omega_{o} \cdot h\right)^{5}\right) n \cdot \omega_{i} d \omega_{i} \\ \quad\\ + \int_{\Omega} \frac{D G}{4\left(\omega_{o} \cdot n\right)\left(\omega_{i} \cdot n\right)} \left(1-\omega_{o} \cdot h\right)^{5} n \cdot \omega_{i} d \omega_{i} =F0Ω4(ωon)(ωin)DG(1(1ωoh)5)nωidωi+Ω4(ωon)(ωin)DG(1ωoh)5nωidωi

离散化,采样根据法线分布函数D选择路线,其中法线n在单条路径中,法线为h
(如下函数为个人理解,与教材中的方程不符)
= F 0 ∑ c o u n t G ( ω o ⋅ h ) ( ω i ⋅ h ) ( 1 − ( 1 − ω o ⋅ h ) 5 ) h ⋅ ω i c o u n t + ∑ c o u n t G ( ω o ⋅ h ) ( ω i ⋅ h ) ( 1 − ω o ⋅ h ) 5 h ⋅ ω i c o u n t = F_{0} \frac{ \sum_{count} \frac{G}{\left(\omega_{o} \cdot h\right)\left(\omega_{i} \cdot h\right)} \left(1-\left(1-\omega_{o} \cdot h\right)^{5}\right) h \cdot \omega_{i} } { count } \\ \quad\\ + \frac{ \sum_{count} \frac{G}{\left(\omega_{o} \cdot h\right)\left(\omega_{i} \cdot h\right)} \left(1-\omega_{o} \cdot h\right)^{5} h \cdot \omega_{i} } { count } =F0countcount(ωoh)(ωih)G(1(1ωoh)5)hωi+countcount(ωoh)(ωih)G(1ωoh)5hωi
可以看出公式中主要需要考虑到数据有:

  1. G ( ω o ⋅ h ) ( ω i ⋅ h ) h ⋅ ω i = G ( ω o ⋅ h ) \frac{G}{\left(\omega_{o} \cdot h\right)\left(\omega_{i} \cdot h\right)} h \cdot \omega_{i} = \frac{G}{\left(\omega_{o} \cdot h\right)} (ωoh)(ωih)Ghωi=(ωoh)G
  2. ( 1 − ω o ⋅ h ) 5 \left(1-\omega_{o} \cdot h\right)^{5} (1ωoh)5
  3. 如何进行采样 如何进行采样 如何进行采样
  4. 如何积分 如何积分 如何积分

问题1

代码如下
这里因为HLV的中间向量,因此GeometrySmith可以被优化处理

// ----------------------------------------------------------------------------
float GeometrySchlickGGX(float NdotV, float roughness)
{
    // note that we use a different k for IBL
    float a = roughness;
    float k = (a * a) / 2.0;

    float nom   = NdotV;
    float denom = NdotV * (1.0 - k) + k;

    return nom / denom;
}
// ----------------------------------------------------------------------------
float GeometrySmith(vec3 N, vec3 V, vec3 L, float roughness)
{
    float NdotV = max(dot(N, V), 0.0);
    float ggx1 = GeometrySchlickGGX(NdotL, roughness);
    return ggx1 * ggx1;
}

int main(){
	for(i : count){
		float G = GeometrySmith(H, V, L, roughness);//教材中的 H 为宏观法线 N,这里设为微观法线H
		float G_Vis = G / VdotH;
	}
}

问题2

float Fc = pow(1.0 - VdotH, 5.0);

问题3:如何进行采样

我们已知光线输出方向为 V = ω o V = \omega_o V=ωo,采光防线为 L = ω i L = \omega_i L=ωi
采光方向的计算采用在预过滤篇使用的采样方式,在以N为周边的法线区域采样的得到H,在通过反射计算得到L

vec2 Xi = Hammersley(i, SAMPLE_COUNT);
vec3 H = ImportanceSampleGGX(Xi, N, roughness);
vec3 L = normalize(2.0 * dot(V, H) * H - V);

问题4 : 如何积分

按照公式,得到每个所有采样方向积分的综合

		A += (1.0 - Fc) * G_Vis;
        B += Fc * G_Vis;

之后对积分求平均,返回。

    A /= float(SAMPLE_COUNT);
    B /= float(SAMPLE_COUNT);
    return vec2(A, B);

问题5:为什么分两段存储

第二部分卷积主要求解:当入射角度为 V ⋅ N V \cdot N VN ,粗糙度为 r o u g h n e s s roughness roughness 时, B R D F BRDF BRDF的平均值。

然而,不同材质应该拥有不同的反射性质,即不同的反射系数以及BRDF,但在实时渲染中,这里做了简化。
实时渲染中不同的材质的参数只包括:粗糙度,基础反射系数
因为不同材质的拥有不同的 F 0 F_0 F0基础反射系数与材质基础颜色金属度有关。
而反射率 F F F 与粗糙度 r o u g h n e s s roughness roughness 有关。

因此 L U T LUT LUT 表的构建不需要任何参数的输入,即与环境贴图,材质纹理,观察角度都无关,一个贴图适用于任何场景。因此在实际使用中,只需要保存该表,每次程序运行时加载就好,不需要计算得到。

生成结果

在这里插入图片描述

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

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

相关文章

基于异常值鲁棒性问题的极限学习机的回归问题研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

外贸软件解决玩具行业管理难点,提升业务效率

在玩具外贸市场,中国显而易见是玩具的生产大国,但却不是玩具生产强国。与发达国家相比,我国玩具行业市场集中度较低,对于国外玩具采购商来说,他们对于采购费用都是相对固定的,连对采购的需求也不会有多少变…

解决在vue中使用elementUI自定义校验及点击提交不生效问题

前言: 本章讲述的主要是对身份证号码的校验 及 为何校验了但提交不生效问题。 拓展小知识: 🍀 1、身份证号码(二代18位身份证)的含义: 1️⃣ 1-2位:代表所属省级政府的代码; 2️⃣ 3…

【前端】原型和原型链

最近面试的时候,面试官有问到这个,答得很简单,感觉了解得不深,下来之后自己又搜索了一下动手看了看相关的内容。 a. 每个函数都有prototype属性,称之为原型;因为这个属性的值有时候是一个对象,…

2023-04-04 2016天梯赛决赛练习题L2

7-11 互评成绩 学生互评作业的简单规则是这样定的:每个人的作业会被k个同学评审,得到k个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输…

JUC概述

1. JUC是什么? 在 Java 5.0 提供了 java.util.concurrent(简称JUC)包,在此包中增加了在并发编程中很常用的工具类。此包包括了几个小的、已标准化的可扩展框架,并提供一些功能实用的类,没有这些类,一些功能会很难实现或…

【JavaEE】SpringBoot配置文件的设置及其读取

目录 配置文件作用 配置文件注意事项 properties 用法 修改字符集 优缺点 yml 用法 优缺点 读取配置文件 使用 Value注解 读properties配置文件 读yml配置文件 使用 ConfigurationProperties 注解 读properties配置文件 读yml配置文件 配置文件作用 SpringBoot的…

MCMC采样

MCMC采样 MCMC 是一种随机的近似推断,其核心就是基于采样的随机近似方法蒙特卡洛方法。而近似推断中又可以分成两大类,即为确定性近似 (VI) 和随机近似 (MCMC)。我们需要从概率分布中取 个点,从而近似计算这个积分。常用采样方法有&#xff…

开关柜绝缘状态检测与故障诊断

摘要:电力开关柜作为电力系统的关键设备广泛应用于输电配电网络,其运行可靠性直接影响着电力系统供电质量及安全性能。开关柜绝缘状态检测与故障诊断是及时维修、更换和预防绝缘故障的重要技术手段。在阐述开关柜绝缘状态评估的基础上,指出其内典型的局部…

Docker --- 基本操作、Dockerfile自定义镜像

一、Docker的基本操作 1.1、镜像操作 镜像名称 首先来看下镜像的名称组成: 镜名称一般分两部分组成:[repository]:[tag]。 在没有指定tag时,默认是latest,代表最新版本的镜像 如图: 这里的mysql就是repository&…

数据库课设--基于Python+MySQL的餐厅点餐系统(表的设计)

文章目录 一、系统需求分析二、系统设计1. 功能结构设计2、概念设计2.2.1 bill_food表E-R图2.2.2 bills表E-R图2.2.3 categories E-R图2.2.4 discounts表 E-R图2.2.5 emp表E-R图2.2.6 food 表E-R图2.2.7 member表E-R图2.2.8 member_point_bill表E-R图2.2.9 servers表E-R图2.2.1…

MySQL的事务原理和实现

一、事务属性与架构概述 1、基本概念: 事务(Transaction)是访问和更新数据库的程序执行单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL…

为什么很多程序员不反感加班?行内人:老板给钱是真的给啊

为什么很多程序员不反感加班?行内人:说给钱老板真的给! 一提到程序员,大部分人第一反应是加班多、996、脱发,这几乎成了外界对程序员刻板印象的标配。不少知名的互联网大厂也是加班之风盛行,譬如著名的华为…

Java版企业电子招投标采购系统源码之登录页面

信息数智化招采系统 服务框架:Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构:VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术:Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、Stre…

Centos8编译安装内核

首先下载kernel,5.x版本的内核,下载地址: https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ 系统安装相关包: # yum install -y bc gcc make python3 ncurses-devel flex bison openssl-devel elfutils-libelf-devel将内…

南大通用数据库-Gbase-8a-学习-34-gcdump(导出数据库对象定义)

目录 一、测试环境 二、介绍 三、命令帮助 四、参数介绍 1、--print-defaults (1)含义 (2)例子 2、--connect_timeout (1)含义 (2)例子 3、-A, --all-databases &#xf…

软考初级考什么比较好?信息处理技术员怎么样?

软考初级信息处理技术员难度不大,零基础也是可以直接报考的,熟悉电脑,多练习就差不多了。 本考试设置的科目包括: (1)信息处理基础知识,考试时间为150分钟,笔试,选择题…

92、Nerfbusters: Removing Ghostly Artifacts from Casually Captured NeRFs

简介 主页:https://ethanweber.me/nerfbusters/ 在远离训练视图的新视图上渲染nerf可能会导致伪影,例如浮动或糟糕的几何形状。这些工件在野外捕获(a)中很普遍,但在NeRF基准测试中很少看到,因为评估视图通常从与训练视图相同的相机路径中选…

HTB_Under Construction—jwt伪造与sqlite注入

根据提示,此题目应该是代码审计类型的,文件结构如下 一般思路有两个,一是看有没有什么敏感信息,二就是看参数传递的地方能否利用,包括注入,伪造等 分析代码 index.js 先来分析入口文件,这是标…

零基础C/C++开发到底要学什么?

作者:黑马程序员 链接:https://www.zhihu.com/question/597037176/answer/2999707086 先和我一起看看,C/C学完了可以做什么: 软件工程师:负责设计、开发、测试和维护各类型的软件应用程序;游戏开发&#x…