前回
SDEFを実装するにはどうすれば・・・
という所まで書きました。

 ところで、
three.js はリビジョンが上がると、
APIの後方互換性が失われる破壊的な変更とか普通にあったりするので(^_^;)
逐一変更を取り込むのがメンドーだったりします。

 そんなわけで、
3,4年前にMMDビューワーとか作った際は、
ずっとr58をベースにして、改造したりして使っていました。

 気がつけば、
three.js のリビジョンは現時点で 100 を超えています。
しばらく見ないうちに随分と進んでしまっています。
SDEFを実装するにあたり、
r58ベースでやったとしても、
SDEF固有なパラメータをシェーダーに渡す関係で、
大きく手を入れる必要がありそうです。

 ということで、
どうせ手間が掛かるのなら
新しい機能とかについても気になるので、
より新しい three.js を使うのが良さげな感じに思えてきました。

 そこで、
現時点で最新のソースコードを眺めてみることにしました。
なるほど色々と変わっているようです。
気になった部分や r58 の頃とどう変わったのか、
それらについて以下に列挙してみます。

 頂点情報とかを構築するためのクラスが、
Geometry から BufferGeometry
ほぼ全面的に移行されているようです。
前者は、抽象度高めで人間からすると分かりやすい感じですが、
そのぶんWebGLなデータへ変換するためのコストがかかります。
後者は、GLな属性値をそのままバッファとして扱うので、
余計なコストがかからない感じです。
感覚的にはちょっと分かりにくくなりますが、
慣れればどうってことはなさそうです(^_^;)

 WebGL関連が良い感じにまとめられ、
整理されて扱いやすくなっている感じです。
シェーダに渡す変数である uniform について、
以前は「型」に相当する値を明示的に付加する必要があったのを、
glslなコードをコンパイルした結果をもとに
自動でやってくれるような作りになっていました。
glslコード側に存在しない uniform を
渡そうとしても無視してくれるようです。
作りそのものは少々込み入った感じですが、
単純に値やオブジェクトのままで扱ってくれるのが良いですね。
中々うまいことやってるなと関心した次第です。

 一方でちょっと気になったのが、
描画対象となりうるクラス等について、
例えば isBoneisMesh とか、
識別するためのプロパティが存在していることです。
普通に考えると instanceof Bone とかやるのが筋なような気がします。
isBoneとか要らないのではないかと思いました。
はっきりしたことは分からないのですが、
おそらく、一部のモジュールを外して
カスタマイズしたthree.jsを生成できるようにするための考慮のようです。
instanceof の場合は対象のコードが存在してないとエラーとなりますが、
isXXX なら存在しないだけでエラーとはなりません。
とはいえ、”WebGLRenderer.js” 等を見てみると、
isXXX が多用されていてカオスな感じになっているのは否めません。
WebGL固有なパラメータをセットアップするために
やむを得なかったのかもしれませんが、
対象クラス側に、例えば
onSetupDependencies(renderer, parameters) といったような
コールバックを設定し、それを呼び出すようにしたら、
もう少しコードがスッキリするのではないかと感じました。
まぁ、そうは上手く行かない場合もあるのかもしれませんが・・・。

 シェーダーは大きく変わっていますね。
BRDFな物理的理論に基づいた、
より現実に即した表現を追求している感じです。
技術的にはこちらこちらが参考になりそうです。
さっぱりよく分かってなかったりしますが、
光源による直接的な影響だけでなく、
それから派生する間接的な影響も考慮して表現する感じのようです。
シェーダーのコードはだいぶ整理された感じになっており、
ざっくり言うと、
最終的なシェーディング = 直接光による影響 + 間接光による影響
という一貫した設計になっている感じです。
実際の中身はそれなりに複雑ですが・・・(^_^;)
シャドウマップによる影は直接光のみを遮蔽するので、
影の濃さや色は間接光によって決まるようになっています。
r58 の頃は影の濃さを調整できたりしましたが、
より物理的に正しい実装になったので、
そういうのは、そもそも必要なくなったようです。

 さて、続いて
MMDを扱うために改造すべき点などについて書こうと思ったのですが、
なんか少し長文になってしまったので、
次回でやりたいと思います(^_^;)

コメントする

メールアドレスが公開されることはありません。が付いている欄は必須項目です。