2013-05-12 73 views
1

我是OSL的初學者,對其「輻射封閉」感到困惑。OSL中的輻射封閉

僅以漫反射閉合爲例。我們可以直接寫

次=漫射(N)

在OSL文件以使用漫閉合。該文件說「閉包的內部部分留給渲染實現」。但是我知道diffuse是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); 
} 

因此,似乎沒有別的在外面渲染工作要做。那麼,「閉包的內部部分留給渲染實現」究竟意味着什麼?

任何解釋將不勝感激!謝謝!

回答

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; 

被稱爲在稍後的時間,多次,如果需要的話,由主機渲染器。因此,對渲染器自身內部的需求:渲染器決定何時實際調用這些內容。