What is the good way to implement calculatenormal()?

by syoyo

calculatenormal(P) is the method to calculate normal vector from the given point P by differentiating it(dP/du, dP/dv), but it is difficult to accurately calculate derivatives for displaced point.
Although computing derivatives by numerical differentiation is possible(and easy to implement), but is it really enough for production rendering?

I have some idea for implementing calculatenormal() by some sort of analytical method, but need to test it whether it gives correct answer and applicable under various conditions.

[Ja]

RenderMan Shading Language には calculatenormal() という関数があって、こやつがちょっとしたくせ者です.
calculatenormal(P) は点 P の法線を計算するのですが, このためには微分値が求まる必要があります.
まあ普通の微分値なら, たとえば物体が曲面であればそれなりに精度よく求まるのですが,
問題はたとえば displacement シェーダで変異させた P にも calculatenormal() は適用できるということ.

こうなると, 解析的にそしてまた精度よく calculatenormal() を実装するのは難しくなります.
某スタジオのひとに聞いた所, 実際のところ某レンダラは数値微分で実装しているらしい.
「それでいいのか!?」 と思いますが… (まあ実際それじゃ満足しないらしいですが)

そんなわけで, 頭の中では displace された P でも数値微分使わなかったりしてきれいに calculatenormal() が出来るアイデアがいくつかあるのですが,

* 本当にできるのか?
* そもそも数学的にそんなことができるのか?
* どのような条件下まで適用できるのか?

を検証しなくてはなりません.

# まあしかし, calculatenormal() の中身の実装を数値微分以外できれいに求めるにはどうするか?
# なんて考えているひとは世界にどれくらいいるのでしょうかね 🙂

Advertisements