過去の独りごち/独りごとはこちら
過去のJavaアプレットは
こちら

 

8/25 VS/PSを使ってみる-2

 今日は影を付けてみました。

  

 ああ、やっぱり影があると情緒が違いますね。お父さんの中の人もさぞ喜んでいる事でしょう。 お父さんの表情もなんだかイキイキした感じですね。

 でも、影が切れたり体がギサギザになったりします。お父さんの中の人もなかなか大変そうです。でもモミアゲが付いたみたいに見えるのがちょっと気に入ってるようですね。

 …と、いうわけでシャドウマップを使って影を付けてみました。

 手持ちのRadeon9600では、デプスステンシルバッファをテクスチャとして生成できないのですが、代わりにといいますか、Rチャネルだけ32ビット浮動小数(D3DFMT_R32F)とか、RGBA各32ビット浮動小数(D3DFMT_A32R32G32B32F)とかの物騒なカラーバッファを生成できます。で、今回はR32Fテクスチャにして、シャドウマップとして使っちゃいました。

 やり方としては、

  1.  光源の位置にカメラを設定して、そこからレンダリングして、奥行き(z/w)をシャドウマップに書き込んでおく。
     シャドウマップにはデプスステンシルサーフェスをつけておく。シャドウマップとデプスステンシルサーフェスには重複した情報が書き込まれるけど、やむなし。
     こうして、シャドウマップには、「光源から見て一番手前の物体までの深さ」が書かれる
  2.  普通にレンダリング
  3.  各頂点を光源の位置から見て、シャドウマップより奥にあると判断されるなら、その頂点より手前に物体が割り込んでいるというわけで、つまり影が差している。これを踏まえて、影をつける。

 2と3は本来分ける必要は無いのですが、分けないと、「Cook-Torranceのシェーディングを施した後、シャドウマップを参照して…」といった具合に、今まで書いたVS/PS全部に影付けのためのコードを加える必要があるので、計算コスト的には優しくないのですが、シーン本体のためのパスと影付けのためのパスを別々にしました。

 原理はクラシカルな方法なんですが、シャドウマップ自体の精度は高いはずなんです。でも、ギサギサの影とか色々でてしまいますね。まぁ、何の事は無い、シャドウマップの精度ではなく解像度の問題はどうしてもつきまとうわけです。はい。でもシャドウマップが1024x1024とかにならいと、あんまり綺麗な出力になりません。きっとなんとかするコツみたいなのがあるに違いない。

 ともあれ、ポリゴン数がモリモリ増えるシャドウボリュームってあんまり好きではないし、シャドウマップでなるべくなんとかしたいところです。影のくせに本体よりポリゴン食うというのがそもそも納得行かなかったり。これもハード重視の日本人体質なんでしょうか。

 やっぱり、現状ではPlanarProjectedとか使ったほうがいいのかなぁ〜 フォトリアリスティックレンダレングとかいいつつ、ちょっとリアルに影付けたらいきなりガタガタに遅くなりますた、とかいうのもカッコ悪いもんですね。

 やっぱ丸影でいいよ、というのはダメですか。そうですか。

Taku Hayase(SANDMAN)

戻る