【感想】巴山竜来『リアルタイムグラフィックスの数学―GLSLではじめるシェーダプログラミング』

この本を数か月前に読んで面白かったです。2022年に読んだ技術書の中でベストだったので、紹介しよう。と思って書き始めたら、なんか前置きが長いだけの謎文章になってしまったけど公開します。。

この本を読むと、こんなのが作れるようになります。

ちなみに私はGLSLじゃなくてRustとWGSLでやってたんですが、もし興味あればここにメモとコードを公開しています。

コンピューターグラフィックスのどこに入門する?問題

さて、この本を読む前に、コンピューターグラフィックス、と一言にいってもいろんな種類があります、という話をしたいです。 その分類を語れるほどの知識は私にはないんですが、私はこの全体像的なことがわからなくてだいぶ道に迷ったので、もしかして誰かの役に立てばと思い、間違っていてもざっくりしたイメージを書き残しておきます。あくまで素人から見たものとして、話半分に読んでいただければ。。

リアルタイムかオフラインか

まず、描画がリアルタイムか、そうでないか(オフライン)、で話は大きく変わってきます。 なぜなら、多くの場合、処理速度と描画のクオリティはトレードオフの関係にあるからです。

当たり前ですが、リアルタイムであればリアルタイムに画面を生成する必要があります。 60fpsであれば、1秒間に60フレームの画像が使われますが、ということは、1フレームの描画に許された時間は1/60秒しかありません。 つまり、この時間内に終わるような計算量の処理しか盛り込めない、という制約があります。 このために、どうやって計算をショートカットするか、物理法則をどこまでいい感じに近似できるか、みたいなテクニックが生まれていくのがリアルタイムレンダリングの面白いところです。

一方、時間的な制約のないオフラインレンダリングは、処理速度を気にせずクオリティを追求することができます。 具体的には、画面に届く光線の軌道を無数にシミュレーションするray tracingという手法を惜しみなく使うことができます(リアルタイムでもray tracingを使うこともあります)。 例えば、全編 CG の映画は、1枚の絵を生成するのに何時間かかろうが(もちろん公開に間に合わせる必要はありますけど)、映画館のスクリーンに耐えるクオリティを達成することの方が重要なわけです。

物体をポリゴンで表現するか数式で表現するか

もうひとつ大きな点は、なにか物体を描くのに、予め用意しておいたポリゴンのデータを渡すか、物体の形を表現する数式を使うか、というアプローチの違いです。

たとえば、ゲームのキャラクターなどはポリゴンで表現されることが多いでしょう。ポリゴンは、まずCPU側でGPUで扱える最小単位(三角形)にまで分解され(tessellation)、それがGPU側に渡されて処理されます。

一方、物体を、物体の表面からの距離を表す数式(SDF = Signed Distance Function)として処理する、というアプローチもあります。 『リアルタイムグラフィックスの数学』はこちらにフォーカスした本です。 数式では、ポリゴンのように思い通りの形を扱えるわけではありませんが、処理がGPUで完結するので速い、というのが利点です。

ちなみに、「思い通りの形を扱えるわけではありませんが」と書きましたが、すごい人は例外で、数式だけで人間のキャラクターを描けたりします(すごい)。

(この、ポリゴンかSDFか、というのは、リアルタイムとオフラインほどすっぱり分かれるものではありません。実際には、どちらも組み合わせて使われることも多いでしょう)

ここまでのまとめ

コンピューターグラフィックスにはいろいろあり、その中でも『リアルタイムグラフィックスの数学』はリアルタイムレンダリングの、数式でつくるコンピューターグラフィックスについての本です。 ちなみに、あともうひとつコンピューターグラフィックスを二分する要素として、2Dか3Dか、というのもありますが、この本はどちらも扱っているので安心ですね。

これがどういう位置づけの本かについては、著者の方の解説もあるのでそちらを読みましょう。

もし「違うな」と思ったら

さて、ここまで読んで気付いたと思いますが、あなたの興味がリアルタイムレンダリング・数式でなければ、この本は入り口ではないかもしれません。

オフラインレンダリングに興味があるなら、ray tracingのチュートリアルとして、Ray Tracing in One Weekendが有名なので、まずはこれを自分が得意な言語で写経してみるのがいいでしょう(だいたいググればすでにある)。

また、リアルタイムレンダリングでも、ポリゴンを使ったコンピューターグラフィックスに興味があるなら(あとRustがわかるなら)、Learn Wgpuがコンパクトにまとまっていておすすめです。Learn OpenGLも少し古いですが多くのトピックが網羅されています。

本を読んでみて

前置きが長くなりすぎましたが、本の紹介です。

著者の方も書かれているように、この本はノイズとSDFにフォーカスした本です。それも、

ノイズ関数もSDFも,単に値を入れると値が出てくる数学的な関数にすぎないのですが,数学に関する仕事をしている私からすると,非常に奇妙で「よく分からない」関数でした.ノイズとSDFに関する解説記事は,ネットを検索すると山のように出てきますが,基本的に「使う視点」で書かれたものが多く,なぜこういう風に定義するとうまくいくのか,という私なりの納得を得ることはできませんでした. (https://note.com/hayamatomoe/n/n4c66c334092a

という問題意識から、「どう使うのか」ではなく「どのようにできあがっているのか」について、ゼロから解説してくれます。 正直、数学的な話については理解が追い付かないところもあったのですが、少しづつ知識が積み重なって発展していく感じが、読んでいて楽しかったです。 前章まででつくったパーツを組み合わせて更に高度なグラフィックができあがっていくので、達成感があります。

なんか精神論みたいになってしまいますが、この本から学べることで一番大きいのは、 この「ゼロからつくって積み上げていくという精神」みたいなもののような気がしています。 実際、デモシーンというのはそういう世界であり、 入り口としてこれほど適切な本はないでしょう。 今やもう、いい感じの映像を出すGLSLコードはChatGPTが生成してくれそうな時代ですが、 時代だからこそ、自分でスクラッチで道具をつくっていく中にこそクリエイティビティがあるような。

みたいな話もインタビューでされていて興味深かったです(46:00ごろ~)。

余談

ちなみに、個人的な話をすると、ニンジャスレイヤーというサイバーパンクニンジャSF小説に「メガデモ」が登場する話があり、そこからデモシーンというものの存在について知りました。

で、デモシーンに興味は持ったものの、シェーダープログラミング(というか「シェーダー芸」と呼ばれるたぐいのもの)に入門する方法がわからなくて挫折していました。 それから幾星霜、ようやく自分のような素人でも読める本が出てほんとに嬉しいです。