さやちゃんぐbotブログ

シェーダーで遊んだりするブログです。

ノイズ一覧。

f:id:sayachang_bot:20191218181209p:plain

ハイハイハイハイ!さやちゃんぐbotです。

この記事はシェーダーアドベントカレンダー17日目の記事として書かれています。

qiita.com

16日目はttk1さんによる「フラグメントシェーダでフラクタル図形を描画する」でした。

qiita.com

今日はノイズの一覧を書きます。たいへんライトな記事になることでしょう!

筆者はノイズが良くわかっていないので、いろいろと調べながら本記事を作っていきます。

本記事では以下のような名前を知ることができます。

  • ホワイト、ピンク、ブラウニアン、ブルー、パープル、グレイ、バリュー、パーリン、シンプレックス、ウェーブレット、ガボール、フェーザ、ワーリー、アリゲーター、ボロノイ、ターブレント、パーリンフロー、カール

 

それではやっていきましょう!

ノイズという文字を見た時、まずは雑音という意味が頭に浮かぶことと思います。何か音を聞いている時に「ザー」となったらそれがノイズです。

あるいは何か邪魔なものを指すかもしれません。Googleで検索している時に、欲しいものとは違うページが出てきたり、内容が薄いまとめサイトが目に入ったら、それをノイズと呼ぶことがあります。

プログラマーであれば、パーリンノイズということばを聞いたことがあるかもしれません。乱数に似ているけれど、なんだかパーリンノイズを使っておけばいいかんじになるので使うといった経験をした人もいるかもしれません。

 

乱数

まず乱数、ランダムってなんでしょうね。

ひたすらGoogle先生Wikipedia先生に質問しまくっていると、乱数にはいろいろ種類があることと、とりあえずアルゴリズムの名前だけはわかってきます。

一様分布に従う確率変数から標準正規分布に従う確率変数を生成させる。

  • ジッグラト法

確率分布乱数生成法のひとつ。

積分布関数の逆関数を使う。つまりlogで乱数を作る。

  • Odd-Even 法

 よくわかんないや!奇数と偶数を使うの?乱数の教科書読むと良さそう。

 アリスは楽勝な賭けをしているように見えるけれど、実はとても分の悪い賭けをしているのかもしれない…。

http://www4.math.sci.osaka-u.ac.jp/~sugita/Public/imath/ipaper/MCM_SS.pdf

  • モンティパイソン法

すごい…こんな名前の乱数生成あるんだ……。いいかんじにシンメトリーなガンマ分布が作れるっぽい?

https://www.jstatsoft.org/article/view/v003i03

  • Xorshift

ビット演算を使う高速な疑似乱数生成法。

日本製の疑似乱数生成アルゴリズム。周期が 2^19937-1(メルセンヌ数)と長い。

 

他にもいろいろあるよ。 

 

オーケー!乱数完全に理解した!!ぜんぜんわからん!!!チョットワカルレベルになるためには、自分で手を動かして車輪を作るべきでしょう!!!!

幸い、勉強するのに良い書籍があります。「計算機シミュレーションのための確率分布乱数生成法」を読みましょう。

https://www.amazon.co.jp/%E8%A8%88%E7%AE%97%E6%A9%9F%E3%82%B7%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AE%E7%A2%BA%E7%8E%87%E5%88%86%E5%B8%83%E4%B9%B1%E6%95%B0%E7%94%9F%E6%88%90%E6%B3%95-%E5%9B%9B%E8%BE%BB-%E5%93%B2%E7%AB%A0/dp/4903814351

 

ノイズ

さて、ノイズです。ここでのノイズは、ランダムっぽいけれど人にとって自然に感じられるものとして扱います。CG分野、音声分野などで使うやつです。

ノイズには定義があるのでしょうか。あれこれ調べたところ、以下のような性質があるようなないような気がして参りました。

  • 完全にランダムだったり、規則性があるっぽいランダムっぽい何かだったりする
  • 再現性があったり、再現性がなかったりする
  • 絵作りや音作りで使ったり、使わなかったりする
  • スペクトル密度が均一だったり、バラバラだったりする
  • 連続性があって微分可能だったり、連続性がなかったりする

あやふやすぎる!!これが筆者の理解できる限界でした。誰かおしえて。ぜんぜんわからん。

 

ということで、続いてノイズ一覧です。

 

カラードノイズ

まずは昔ながらの色付きノイズからいきましょう。

ホワイトノイズ

スペクトル密度が均一なノイズ。いわゆるランダム。「シャー」という音に聞こえる。正規乱数(White Gaussian noise)で作る。ジッグラト法とか。

f:id:sayachang_bot:20191217214033p:plain

ピンクノイズ

「ザー」という音に聞こえる。1/fゆらぎとも呼ばれる。

f:id:sayachang_bot:20191217214229p:plain

ピンクノイズを使って眼球のマイクロサッカードを実装するという論文があります。面白い。

http://bw.swps.edu.pl/docstore/download.seam?fileId=SWPS47110ef99f7346f6974f9ba25b961401

ブラウニアンノイズ

ブラウン運動で生成するノイズ。スペクトル密度は1/f^2。

ブルーノイズ

画像を二値化するディザリングで使われる。

パープルノイズ

1オクターヴ上がると6dB増える。

グレイノイズ

等ラウドネス曲線のようなノイズ。

 

このあたりを書いている時点ですでに力尽きているので、カラードノイズのテクスチャや波形は各自調べてください!!ひどい。雑すぎる。

 

ここからはさらにいろいろなノイズを紹介していきます。

 

バリューノイズ

f:id:sayachang_bot:20191217215438p:plain

ここからのノイズについては、まずはThe Book of Shadersを読むのが良いでしょう。

thebookofshaders.com

なんらかの疑似乱数を使い、0.0から1.0までの範囲に対して線形補間やエルミート補間で値を決める手法です。グラディエントノイズという分類っぽい。

こちらも読むと良いでしょう!

c5h12.hatenablog.com

パーリンノイズ

パーリンノイズはバリューノイズを発展させたかんじです。fBm(fractional Brownian motion)とも呼びます。ゲームでは地形の生成、雲や炎のテクスチャ生成、敵の動きのパターンなどに使えるでしょう。

オーケー、正直に、正確に書こう。筆者はバリューノイズ とパーリンノイズの違いがよくわからない。割と本気で誰か教えて欲しい。

パーリンノイズについては以下書籍を読むと良いでしょう。

https://www.amazon.co.jp/Texturing-Modeling-Procedural-Approach-Third/dp/4862460860

改良パーリンノイズ

パーリンノイズの改良版です。補間でエルミートのかわりに5次のフェード関数を使うのが特徴的です。3次のエルミートよりも継ぎ目が自然になるのですね。

t * t * t * (t * (t * 6 - 15) + 10);

postd.cc

シンプレックスノイズ

論文があるからそっちを読んでね!

http://weber.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf

ウェーブレットノイズ

Pixarの論文があるからそっちを読んでね!

https://graphics.pixar.com/library/WaveletNoise/paper.pdf

ガボールノイズ

f:id:sayachang_bot:20191218180502p:plain

論文が(略)

graphics.cs.kuleuven.be

ガボールノイズはMODOで使えます。

modogroup.jp

フェーザノイズ

f:id:sayachang_bot:20191218180847p:plain

フェーザノイズはガボールノイズを改良したもので、SIGGRAPH2019で発表されました。この記事を出す時点では最新のノイズです!
ガボールノイズを強度と変調正弦波成分に分離し再定式化したもの。周期関数。コントラストの高いパターンを生成できます。

論文はこちら。

https://hal.archives-ouvertes.fr/hal-02118508/document

英語読むのがめんどくさい人のために、7月にPixivでLTやったスライド貼っておきます。

docs.google.com

ワーリーノイズ

論文(略)

http://www.rhythmiccanvas.com/research/papers/worley.pdf

アリゲーターノイズ

ワニ革模様のノイズです。Arnold for MAYAで利用できます。Houdiniではワーリーノイズのパラメータ調整で似たようなルックになるっぽい。

docs.arnoldrenderer.com

https://www.sidefx.com/ja/docs/houdini/nodes/vop/turbnoise.html

ボロノイノイズ

ステンドグラス模様を作ったり、破壊されたオブジェクトの分割に使ったりするボロノイです。

書籍のリンクとかGLSL/HLSLのコードとかを載せたScrapBoxのページを用意してあるので、そちらをご参照ください。

scrapbox.io

ターブレントノイズ

ターブレントノイズはHoudiniで利用できるノイズです。

https://www.sidefx.com/ja/docs/houdini/nodes/vop/turbnoise.html

符号付きノイズの絶対値を利用します。The Book of ShadersでTurbulence(乱流)の説明をご参照ください。

thebookofshaders.com

パーリンフローノイズ

論文(略)

http://evasion.imag.fr/Publications/2001/PN01/sketch_col.pdf

カールノイズ

f:id:sayachang_bot:20191218183953p:plain

カールノイズは流体シミュレーションを行うために利用できるノイズで、炎、煙、水などの表現に利用できます。数学的な考え方に基づいていて、ベクタフィールドにアトラクターというパラメータを与えることで、パーティクルにさまざまな挙動を実装できます。

UE4だとアトラクターのモジュールが使えます。

docs.unrealengine.com

いろいろな種類のアトラクターを眺めたい人にはこちら。GLSLでAizawa、Arneodo、Dadras、Dequan、Lorenz、Thomasといったアトラクターがコード付きで載ってます。(先日ツイッターに出てきた、VRChatで「アトラクターに乗る」のはローレンツアトラクターでしたね)

fusefactory.github.io

 

おまけの話

なんとなくノイズにちょっと関連したおまけの話も書いちゃう。

fract-sin

よく見る例のハッシュです。

fract(43758.5453*sin(dot(fract(p),vec2(12.9898,78.233))))

これが何者なのか?はStack Overflowを読むと良いでしょう。

stackoverflow.com

mod289

パーリンノイズに登場する謎のマジックナンバー289というものがあります。
これについて書かれたものはこちら。

http://webstaff.itn.liu.se/~stegu/jgt2011/article.pdf

GLSLにnoise関数が無い話

どこかで見かけたやりとりが興味深かったので、ざっとオレオレ日本語訳したものをおまけで載せておきます。

「GLSLのnoise関数が常に0を返すけどこれが普通なの?」
「もう長いこと実装されていない」
OpenGLのドキュメントには載ってるけど」
「ああ、その関数は何もしないんだ」
「ノイズの実装は無数にある。でも、統計的に良い性質のものはどれ?性能の良いものは?」
「この問題は些細なものじゃない。不幸なことに、すべてを満たすたったひとつのノイズというものは存在しないんだ。」

ブラウン運動にまつわる誤解

ひたすらノイズをググってた時にWikipediaの面白い記事を見つけたので、これもついでに載せちゃう。

ja.wikipedia.org

 

 

いかがでしたでしょうか。とりあえず今まで知らなかったノイズ の名前を知ることだけはできたかと思います。

詳しいことはあとは自分で調べてください!!そして何か発見があったら教えてください!!!というかノイズわからん!!だれかおしえて!!!!

 

アドベントカレンダー明日18日目の記事はVRChat界隈での活躍目覚ましいnoribenさんによる「数値を数字として表示するシェーダーを作ったおはなし」です。これは間違いなくヤバい記事になりますね。わたしがほしょうします。

シェーダーアドベントカレンダーを公開したら一番乗りで参戦登録してくれたナイスガイです。あとでのり弁をごちそうしてあげなきゃ。

qiita.com

 

ではでは。

 

追記

ゆんたロボさんがThe Book of Shadersをもとにノイズ実装を説明した良ページを書いているのでここに紹介しちゃいます。

yrlab.zatunen.com