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

相关文章

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的内部工具类 -

MySQL中时区参数time_zone解读

《MySQL中时区参数time_zone解读》MySQL时区参数time_zone用于控制系统函数和字段的DEFAULTCURRENT_TIMESTAMP属性,修改时区可能会影响timestamp类型... 目录前言1.时区参数影响2.如何设置3.字段类型选择总结前言mysql 时区参数 time_zon

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

Python 标准库time时间的访问和转换问题小结

《Python标准库time时间的访问和转换问题小结》time模块为Python提供了处理时间和日期的多种功能,适用于多种与时间相关的场景,包括获取当前时间、格式化时间、暂停程序执行、计算程序运行时... 目录模块介绍使用场景主要类主要函数 - time()- sleep()- localtime()- g

如何使用 Bash 脚本中的time命令来统计命令执行时间(中英双语)

《如何使用Bash脚本中的time命令来统计命令执行时间(中英双语)》本文介绍了如何在Bash脚本中使用`time`命令来测量命令执行时间,包括`real`、`user`和`sys`三个时间指标,... 使用 Bash 脚本中的 time 命令来统计命令执行时间在日常的开发和运维过程中,性能监控和优化是不

C#反射编程之GetConstructor()方法解读

《C#反射编程之GetConstructor()方法解读》C#中Type类的GetConstructor()方法用于获取指定类型的构造函数,该方法有多个重载版本,可以根据不同的参数获取不同特性的构造函... 目录C# GetConstructor()方法有4个重载以GetConstructor(Type[]

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果