1

我是 OSL 的初学者,对它的“辐射闭合”感到很困惑。

仅以扩散闭包为例。我们可以直接写

Ci = 扩散(N)

在 osl 文件中使用漫反射闭包。该文件说“闭包的内部结构留给渲染中的实现”。但我知道diffuse 是OSL 中的内置闭包,OSL 已经在bsdf_diffsue.cpp 中为diffuse 实现了eval_reflect()、eval_transmit、sample() 接口。例如,eval_reflect() 如下:

Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const
{
    float cos_pi = std::max(m_N.dot(omega_in),0.0f) * (float) M_1_PI;
    pdf = cos_pi;
    return Color3 (cos_pi, cos_pi, cos_pi);
}

因此,在外部渲染中似乎没有其他事情可做。那么“闭包的内部结构留给渲染中的实现”到底是什么意思呢?

任何解释将不胜感激!谢谢!

4

1 回答 1

0

这个问题已经开放了一段时间,但无论如何我都会试一试。

在 bsdf_diffuse.cpp 中,甚至对于 oslexec 文件夹下的每个 bsdf_*.cpp 文件,您都会找到从 BSDFClose 继承的类,这意味着它们中的每一个本身都是闭包。

方法

Color3 eval_reflect (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const;
Color3 eval_transmit (const Vec3 &omega_out, const Vec3 &omega_in, float& pdf) const;
ustring sample (const Vec3 &Ng,
                 const Vec3 &omega_out, const Vec3 &domega_out_dx, const Vec3 &domega_out_dy,
                 float randu, float randv,
                 Vec3 &omega_in, Vec3 &domega_in_dx, Vec3 &domega_in_dy,
                 float &pdf, Color3 &eval) const;

如果需要,主机渲染器会在以后多次调用。因此,需要渲染器自己的内部结构:由渲染器决定何时实际调用它们。

于 2013-09-05T15:44:43.147 回答