シェーダ本: 〜「バンプマッピング」まで

今日はバンプマッピングのところだけやりました。
今日も自由に時間が使える……かと思いきや、上司との面談があったりやることがあったりで、昨日ほど時間は取れませんでした。なので、できたのはバンプマッピングだけ。本に書いてある通りにやったので動くものはできたのですが、正直中身はわかっていません。接ベクトルをどうやって求めるのかや、頂点空間の考え方がいまいちです。
それにしても、ハイトマップからノーマルマップを作ってくれたり、接ベクトルを求めてくれたりと、DirectXは至れり尽くせりですね。便利な反面、これを使っていると、実際は分かっていないのに、「分かった気がする」という僕の悪いところが余計に加速しそうで怖いです。時間がたくさんあるわけではないので今はガンガン進もうと思いますが、時間を見つけてしっかり理解していかないと後で痛い目に会いそう……。
ところで、ライトを3つにしてクック・トランスの反射モデルを使ってみたところ、エラーが出て止まってしまいました。はじめはゼロ割でもしているのかと思い、全てチェックしてみたもののエラーは消えず。for文を展開してみてもエラーが消えません。しかし、ライト1つだけで計算をするとエラーが起きません。考えられる原因としては、「命令数が多すぎる」といったようなことなのですが……ピクセルシェーダではこういうことってありうるのでしょうか? なんとも消化不良のまま、とりあえず今日は諦めました。
明日からはいよいよ仕事の方が動き出しそうな予感。せめて影はやっておきたいので、昼休みや就業後など、時間を作ってやってしまいたいと思います。

追記

バンプマッピングについて調べていたら、もんしょの巣穴のこのあたり(第24回第25回)が分かりやすかった。
ハイトマップからノーマルマップの作り方は、ハイトマップから作られる地形ポリゴンを想像するとわかりやすい。各頂点ごとに、U方向の傾きベクトルをdu、V方向の傾きベクトルをdvとする。duはxz平面上のベクトルに、dvはyz平面上のベクトルになるように作る。そして、duとdvの外積から法線Nを作る。xz平面とyz平面は必ず直行するので外積が0ベクトルになる心配はない。
ちなみに、duやdvの作り方を変えれば法線の値も当然変わるんだろうけど、そのあたりはどれが標準なのだろう。本のP.273では、注目頂点の周囲4頂点を見て、左右の頂点の高さの平均をdu、上下(?)の頂点の高さの平均をdvとしている。この方法だと、注目頂点が周囲から見て極端に低い場合は、それ無視されてしまうだろうから怖いなぁ。

狩野さんによるこの説明が分かりやすすぎて素晴らしい。厳密には理解できそうにないけど、概念はすんなりと理解できた。本のP.216-217にも同じ説明があるのだけれど、説明が省略されすぎていて僕にはわからなかった。そのてん、この説明文では基礎的なところまで触れてくれているのでわかりやすい。