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

 

8/26 VS/PSを使ってみる-3

 → 

 影を改良しました。

 あと、スナップショットだと分かりづら過ぎるんですが、地面のエッジにもギザギザした影が出来ていたのがなくなりました。

 IF氏のサイトを参考にしたところによると、なんでもシャドウマップを作るときはカリングの方向を逆、つまり、普通は画面に対して左回りの三角形がカリングされるのに対して、右回りの三角形をカリングすることで、裏面の情報だけをシャドウマップに書き込むんだそうで。なるほど、ポリゴン1枚で作られている地面とかの影は作られなくなります。キレイキレイ。

 フレームレートが妙に上がっていますけど、シャドウマップの解像度を半分にしたためです。解像度が高くなくても、モミアゲ状のギサギザがあんまり出ません。その点だけお父さんも寂しそうですね。

けれど、シャドウマップの欠点も幾分見えてきました。まず、影を付けたい範囲を広げようとして光源の位置を遠めに設定すると、シャドウマップの解像度の問題があるため、影がギサギザになります。解像度の問題はモミアゲ状のギザギザの原因にもなるのでよろしくない。

 それから、お父さんの足元のように、影の落ちる面と光源をさえぎる部分が近い部分は正確に影を付けづらいという問題があります。シャドウマップの精度は前回お話したように、Radeon9600では32ビット浮動小数で取れるため充分といえるのですが、解像度の問題によって影が出来たと誤認される部分を低減するため、ある程度のマージンを持って判定をします。

 マージン無しで厳密に判定すると、物体の表面にはギサギサの影がしばしば現れる事になります。陰になっている部分なので更に影がついても分かりづらいので、Photpshopのトーンカーブで補正したのが左下の図です。

 いや、環境光をつければ分かりやすいんですけど、コンパイルするためにDelphi起動するのもなんだかな〜という事で(w

 ともかく、足元はバッチリなんですけど、背中が煤けてしまうんです。あくまでこれを「セルフシャドウです」と言い張るのもテですけど。

 トゥーンシェーディングとか施してるような作品だったら、まぁこれはこれで味なのかもしれません。ただ、視点とかモデルの角度のが動くと模様もジリジリと不規則に変化するので、見てて愉快かはまた別の問題なんですが〜。

 で、今日は影のほかにKo-Taさんと昼にお会いしたときに話題になった、被写界深度ブラーも実装しようかと思ったんですが、Radeonではデプスステンシルサーフェスをテクスチャとして作成できないので、DoubleSTEAL式に、

  1. ブラー用のテクスチャ(BlurBuf)&デプスステンシルサーフェス(BlurZ)にシーンをレンダリング
  2. BlurBufをステージ0、BlurZをステージ1にセット
  3. ステージ1のBlurZの情報からブレンド率を決め、ステージ0のBlurBufの内容をレンダリング

 という事が出来ないんです。なので、

  1. BlurBufにレンダリング
  2. R32Fフォーマットのテクスチャ(BlurZ')とデプスステンシルサーフェスを作って、R32Fテクスチャの方には奥行きだけ書き込む…悔しいよママン
  3. BlurBufとBlurZ'を使って、以下同様

 つまり、描画パスが余計に1個増えます。コンチクショウ。やっぱり爆プさんのGtSM式にカメラの視線をちょっとずらした結果をブレンドするしかないんかのー。道理でATIにFoVデモとかないわけですね。CopyRectsもDirectX9で無くなっちゃったので、全く同じシーンを3回も書き直すのはいかにもバカらしいことです。

 深度バッファくらいPSから普通に読めたってバチあたらんやろ、とも思うんですが…はて。

Taku Hayase(SANDMAN)

戻る