首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >微面BRDF (包括ggx)能代表完美的镜子吗?

微面BRDF (包括ggx)能代表完美的镜子吗?
EN

Computer Graphics用户
提问于 2019-05-05 17:31:13
回答 2查看 758关注 0票数 6

完美镜的画法很简单,

F\frac{\delta(\omega_i-\omega_r)}{|\cos(\theta_r)|}

如在http://www.pbr-book.org/3ed-2018/Reflection_模型/光谱_反射_和_Transmission.html

正如几篇文章所示,微面片的粗糙度可以定义为零,那么它们就应该能够代表一个完美的镜子。但我不能把它们导出到正确的、完美的地方。

例如,当我将零粗糙度放入GGX模型时,(https://www.graphics.cornell.edu/~bjw/microfacetbsdf.pdf )

D(m) = D(H)除以0,G仅为1。不过,我得到的是,

F\frac{DG}{4|N\cdot V||N\cdot L|}

绘制方程是,

\int F\frac{D(H)G(L,V, H)}{4|N\cdot V||N\cdot L|} \cos\theta_id\omega_i = \int F\frac{D(H)G(L,V, H)}{4|N\cdot V|} d\omega_i

如果这是正确的,\frac{D(H)G(L,V,H)}{4|N\cdot V|}应该是一个狄拉克δ函数。但我不这么认为。

我哪里错了?我怎样才能从微面片中得到完美的镜子呢?

更新

我的结论是,库克-托伦斯的画笔不能代表一个完美的镜子。当H,\neq,N,即使粗糙度为零时,方程有一些小值大于零。因此,不应删除归一化因子4|N\cdot V|

如果我错了就纠正我。

EN

回答 2

Computer Graphics用户

发布于 2019-05-07 06:24:24

如果这是正确的,\frac{D(H)G(L,V,H)}{4|N⋅V|}应该是一个狄拉克δ函数。但我不这么认为。

实际上,你已经接近了你的答案--你只是想找出最初假设是什么--如果你说的是镜面BRDF。术语F\frac{DG}{4|N⋅V||N⋅L|}只起作用,如果你从前提条件开始,你处理的是一个完美的镜子,否则这将是一个积分本身。看看小厄尔·哈蒙( explains .)的GGX+SmithMicrosurfaces漫射照明,这里解释了如何到达镜面的BRDF。特别是看一看幻灯片29:

  • Microfacet是一个完美的镜像。
    • 也就是说,光的反射是当且仅当m = H
      • 从数学上讲,BRDF是一个缩放的dirac增量\delta_m(H, m)

因此,完美的镜子是您的模型在开始的^1-但只为镜面BRDF!

如果你想看到,如果把漫射的BRDF包含到你的BRDF中是一个完美的镜子,那么这个假设不再成立,因此你没有diracδ函数。

^1注意到他说一个微面是一个完美的镜子。但是,如果您的所有微面都是完全对齐的,那么您的微几何“等于”您的宏几何。

票数 2
EN

Computer Graphics用户

发布于 2022-11-23 06:59:09

实际上,我偶然发现了同样的问题。我想我已经在pbr书中找到了解决方案:https://www.pbr-book.org/3ed-2018/Reflection_模型/微面_Models#TheTorrancendashSparrowModel

基本上,据我所知,完美镜子的推导(没有壁画和几何术语)是这样的:

L(\omega_o)=\int \text{brdf}(\omega_i, \omega_o) \cos(\theta_i) d\omega_i=\int\frac{D(\omega_h) L_i(\omega_i)}{4\cos(\theta_i) \cos(\theta_o)}\cos(\theta_i)d\omega_i=\int\frac{D(\omega_h) L_i(\omega_i)}{4\cos(\theta_o)}d\omega_i

然而,关键的细节是分布函数D(\omega_h)=\delta(\omega_h)\omega_h的函数,但是集成发生在\omega_i上。根据pbr书中的公式8.17,

d\omega_h=\frac{d\omega_o}{4 \cos(\theta_h)}=\frac{d\omega_i}{4 \cos(\theta_h)}

,对于在完美镜像上集成的情况,\theta_h=\theta_i=\theta_o,本质上意味着d\omega_i=4 \cos(\theta_o)d\omega_h

现在,最后替代这个d\omega_i并在\omega_h上进行本质上的集成,我们得到:

L(\omega_o)=\int\frac{D(\omega_h) L_i(\omega_i(\omega_h))}{4\cos(\theta_o)}4 \cos(\omega_o)d\omega_h=\int\delta(\omega_h)L_i(\omega_i(\omega_h))d\omega_h=L(\omega_i)

这是因为D(\omega_h)\omega_h的函数,而不是\omega_i的函数。但是,可以通过以下“额外”术语将其中一个转换为另一个:d\omega_h=\frac{d\omega_o}{4\cos(\omega_h)}

票数 1
EN
页面原文内容由Computer Graphics提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://computergraphics.stackexchange.com/questions/8820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档