【问题标题】:radiance closure in OSLOSL中的辐射闭合
【发布时间】:2013-05-12 13:46:12
【问题描述】:

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

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

Ci = 扩散(N)

在 osl 文件中使用漫反射闭包。该文件说“闭包的内部结构留给渲染中的实现”。但我知道漫反射是 OSL 中的内置闭包,并且 OSL 已经在 bsdf_diffsue.cpp 中实现了用于漫反射的 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);
}

所以看起来在外部渲染中没有其他事情要做。那么“闭包的内部结构留给渲染中的实现”到底是什么意思呢?

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

【问题讨论】:

    标签: graphics rendering shader


    【解决方案1】:

    这个问题已经有一段时间了,但我还是会试一试。

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

    方法

    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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-02
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多