Blog?この広告は、90日以上更新していないブログに表示しています。2014-07-06ノイズの話これはレイトレ合宿2!!アドベントカレンダーの4週目の記事です。梅雨真っ盛りでぱっとしない天気が続きますがレイの追跡の具合はいかがでしょうか。7月に入ったとはいえアドベントカレンダーはまだまだ序盤。後のほうにガチな人がいらっしゃるのでレイトレと関係あるのか微妙なネタでもまだ許されると信じていきます。レンダリングしているとテクスチャが欲しくなって、とりあえずチェッカーをつくってみたりします。それに飽きてきたらノイズです。ノイズですよねッ!?もうノイズがあるだけでそれはそれはCGらしくなります。模様だけにとどまらず、バンプやディスプレイス、プロシージャルなオブジェクトと使い道もたくさんある素敵なやつです。そんなわけでちょっとノイズでも作ってみようかと思います。2Dの画像をつくることにして、深いことを考えずに乱数で埋め尽くすとこんな感じになります。これは全ての周波数を含むという重要なノイズで、どれだけ拡大縮小してもほとんど見た目が変わりません。ここにあるのは画像になっているので、拡大するとドットが大きく見えるだけですが。ほしいノイズはこういうのじゃないよ!という声が聞こえてきます。ところでノイズはCGでは基本的に物体の表面に貼付けるテクスチャとして使われます。レンダリング中でも反射や屈折、マルチサンプリングなどで何回も参照されます。デザイン的な部分でも毎回違う値が出てきては困ります。ノイズはランダムなのがいいのですが、これと決めたら同じものが出てこないといけません。そこで本当の乱数ではなく、座標を元にして適当な値を返すハッシュ関数を用意します。お手軽にハッシュテーブルで行くことにします。159]"""なんて感じでお手軽に調達できます。256で繰り返してしまうのがいやなら、もっとサイズを大きくするなり計算だけで値を出せる関数を使うなりしましょう。いうハッシュが好きだとソースに書いています。255.0;}こんな感じでできあがりです。これで毎回同じノイズが生成できるようになりました。ついでにハッシュ関数の入力が整数になっているので、与えられた座標の値を整数に丸めてしまいましょう。iy);}座標値として0から8の範囲を入力しています。整数に丸めたことで、副産物的に大きさも好きにできるようにもなりました。これではただホワイトノイズの画像を拡大したようなものなので、隣の値とブレンドして滑らかにします。これも何でも良いと言えばいいのですが、かのパーリン先生推奨の関数を使います。ご覧の通りとても単純なノイズで、3次元に拡張するのも簡単です。SnadboxやShaderToyで見かけるノイズはたいていこれです。いう滑らかにつなぎたい時によく使われる曲線に似せて作られたものです。なんでも後者の関数は2階導関数が0と1の境界部分で不連続になるため、これで作ったノイズをバンプマップに使うとグリッドの継ぎ目が目立ってしまうんだそうです。左が3次の関数で、右が5次の関数で全く同じノイズを補間したものです。細かい理屈は置いておいて確かにグリッドの線が目立ちますね。ここまでは良くある話なので、折角なのでもう一歩進んでみましょう。格子の点から単純に値を取り出すのではなく、グラデーションになるような関数を通してみます。計算も簡単で方向も指定できるのでベクトルの内積なんか手軽でしょう。すると割り当てたベクトルと格子点から求めたい点へと向かうベクトルとの内積はこんな感じです。ちなみにベクトルVの後ろ側は真っ黒ですが実際には負の値です。...}見覚えのあるノイズができました。素敵です!内積を取っているため負の値も出てきますので、画像は1を足して1/2しています。