Real-Time Rendering——9.8.2 Multiple-Bounce Surface Reflection多次反射表面反射

本文主要是介绍Real-Time Rendering——9.8.2 Multiple-Bounce Surface Reflection多次反射表面反射,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

As mentioned earlier in Section 9.7, the microfacet BRDF framework does not account for light that is reflected (“bounced”) from the microsurface multiple times. This simplification causes some energy loss and over-darkening, especially for rough metals [712].

如之前在第9.7节中提到的,microfacet BRDF框架没有考虑从微表面多次反射(“反弹”)的光。这种简化导致一些能量损失和过度变暗,特别是对于粗糙金属[712]。

A technique used by Imageworks [947] combines elements from previous work [811, 878] to create a term that can be added to the BRDF to simulate multiple-bounce surface reflection:

Imageworks [947]使用的一项技术结合了之前工作[811,878]中的元素,创建了一个可以添加到BRDF中的项,以模拟多次反弹表面反射:

where RsF1 is the directional albedo (Section 9.3) of fsF1, which is the specular BRDF term with F0 set to 1. The function RsF1 depends on the roughness α and elevation angle θ. It is relatively smooth, so it can be precomputed numerically (using Equation 9.8 or 9.9) and stored in a small two-dimensional texture. Imageworks found that 32 × 32 resolution is sufficient. 

其中RsF1是fsF1的方向反照率(第9.3节),fsF1是F0设置为1时的镜面BRDF项。函数RsF1取决于粗糙度α和仰角θ。它是相对平滑的,因此可以用数值方法预先计算(使用方程9.8或9.9)并存储在一个小的二维纹理中。Imageworks发现32 × 32的分辨率已经足够了。

The function RsF1 is the cosine-weighted average value of RsF1 over the hemisphere. It depends only on α, so it can be stored in a one-dimensional texture, or an inexpensive curve could be fitted to the data. Since RsF1 is rotationally symmetric about n, RsF1 can be computed with a one-dimensional integral. We also use the change of variables μ = cos θ (see Equation 9.6 on page 312):

函数RsF1是RsF1在整个半球上的余弦加权平均值。它只依赖于α,所以它可以存储在一维纹理中,或者可以用一条便宜的曲线来拟合数据。因为RsF1关于n旋转对称,所以RsF1可以用一维积分来计算。我们还使用变量μ = cos θ的变化(见312页的方程9.6):

Finally, F is the cosine-weighted average of the Fresnel term, computed in the same way: 

最后,F是菲涅耳项的余弦加权平均值,计算方法相同:

Imageworks provide a closed-form solution to Equation 9.58 in the case that the generalized Schlick form (Equation 9.18) is used for F: 

Imageworks为方程9.58提供了一个封闭形式的解 施利克形式(方程9.18)用于F:

If the original Schlick approximation is used (Equation 9.16), then the solution simplifies to 

如果使用原始的施利克近似法(方程9.16),则解简化为

In the case of anisotropy, Imageworks use an intermediate roughness between αx and αy for the purpose of computing fms. This approximation avoids the need to increase the dimensionality of the RsF1 lookup table, and the errors it introduces are small. 

在各向异性的情况下,Imageworks使用介于αx和αy之间的中间粗糙度来计算fms。这种近似避免了增加RsF1查找表维数的需要,并且它引入的误差很小。

The results of the Imageworks multiple-bounce specular term can be seen in Figure 9.39.

在图9.39中可以看到Imageworks多重反射镜面反射项的结果 .

Figure 9.39. In all rows the roughness of the surface increases from left to right. The top two rows show a gold material. The first row is rendered without the Imageworks multiple-bounce term, and the second is rendered with the multiple-bounce term. The difference is most noticeable for the rougher spheres. The next two rows show a black dielectric material. The third row is rendered without the multiple-bounce term, and the fourth row has the multiple-bounce term applied. Here the difference is more subtle, since the specular reflectance is much lower. (Figure courtesy of Christopher Kulla [947].) 

图9.39。在所有行中,表面的粗糙度从左到右增加。上面两行显示的是金色材质。第一行在不使用Imageworks多次反射术语的情况下进行渲染,第二行在使用多次反射术语的情况下进行渲染。对于较粗糙的球体,这种差异最为明显。接下来的两行显示黑色电介质材料。第三行渲染时没有多次反弹项,第四行应用了多次反弹项。这里的区别更加微妙,因为镜面反射率要低得多。(图由克里斯托弗·库拉[947]提供。)

这篇关于Real-Time Rendering——9.8.2 Multiple-Bounce Surface Reflection多次反射表面反射的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/292802

相关文章

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

C#特性(Attributes)和反射(Reflection)详解

《C#特性(Attributes)和反射(Reflection)详解》:本文主要介绍C#特性(Attributes)和反射(Reflection),具有很好的参考价值,希望对大家有所帮助,如有错误... 目录特性特性的定义概念目的反射定义概念目的反射的主要功能包括使用反射的基本步骤特性和反射的关系总结特性

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

java中反射(Reflection)机制举例详解

《java中反射(Reflection)机制举例详解》Java中的反射机制是指Java程序在运行期间可以获取到一个对象的全部信息,:本文主要介绍java中反射(Reflection)机制的相关资料... 目录一、什么是反射?二、反射的用途三、获取Class对象四、Class类型的对象使用场景1五、Class

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时

Java通过反射获取方法参数名的方式小结

《Java通过反射获取方法参数名的方式小结》这篇文章主要为大家详细介绍了Java如何通过反射获取方法参数名的方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、解决方式方式2.1: 添加编译参数配置 -parameters方式2.2: 使用Spring的内部工具类 -