我是OSL的初学者,并对其“光辉关闭”感到困惑。
以弥散闭合为例。我们可以直接写
Ci = diffuse(N)
在osl文件中使用弥散闭包。文档说“闭包的内部结构留给了渲染中的实现”。但我知道漫反射是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);
}
所以似乎在外部渲染中没有别的事情要做。那么“闭包的内部结构留在渲染中的实现”究竟意味着什么?
任何解释将不胜感激!谢谢!
答案 0 :(得分:0)
这个问题已经开放了一段时间,但无论如何我都会试一试。
在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;
如果需要,稍后会被主机渲染器调用。因此,渲染器需要自己的内部构件:渲染器决定何时实际调用它们。