穴日記

どうだ明るくなったろう

WebGLでリアルタイム流体シミュレーション+レンダリングを実装してみた

はじめに

なんかWebGLが流行ってるらしいのでWebGLすることにしてみました。OpenGLはぼんやりとやったことがあったのですが、ウェッブ技術に対する疎さが深刻化しているのでモダンで先端的なテクノロジーを追及するためにもWebGLの習得は急務といえました。

WebGLJavaScriptと呼ばれるプログラミング言語を用いるようです。僕がJavaScriptを最後に書いたのは四年くらい前にクック●●●のハッカソン?みたいなのに参加した時その場で習得してその場でアプリを作ったとき以来です。それ以来一度も書いていません。

まあJavaScriptとか意識高い大学生でも書けるわけだし適当にAPIを呼び散らかす分には何の問題もないでしょう。というわけでWebGLのサンプルコードを読みながらサンプルドリブンでJavaScriptを習得すんのがいいだろと思いました。

先に結果だけ貼っておきます。いろいろあって流体シミュレーションしつつレンダリングするようなものになりました。
githole/webglSmoke · GitHub

サンプルドリブンプログラミング

とりあえずWebGLのサンプルコードが乗ってるサイトを探しました。WebGLは流行りなだけあって無限にそういうサイトは存在します。こういう時はGoogleで上の方に出てくるサイト=高品質なサイト、というヒューリスティックを実行します。今回参考にしたのは以下の二つのサイトです。

Learning WebGL

wgld.org

前者は英語、後者日本語です。両方のサイトの最初の方のページをブワーって読んでローカルにコピーして実行したりしてみます。適当にコードを書き換えたりするうちに概ねWebGLの初期化の方法を覚えます。

この段階で、WebGLの初期化にさえ至ればあとは慣れ親しんだOpenGLとなんら変わらないという悟りを得ます。こうなればしめたものです。OpenGLAPIを呼ぶのはそう難しいことではありません。GPUにデータを送って、GPUにドローコールを積むだけです。

一つ、面倒なことがあるとすれば行列まわりの演算です。GPUプログラミングなんで、CPUで行列演算してGPUに頂点送ってシェーダーセットしてドローコール呼ぶだけなんですが、その行列演算が驚くべき面倒さです。今回はglMatrixを使いました。なぜか、最新版は4x4行列の逆行列の計算関数が実装されてないっぽく、過去のバージョンから関数を引っ張ってきたりしています。実は実装されてた、みたいな落ちだったら笑えますね。

2D流体シミュレーション

そもそも、「ああ、ブラウザで流体シミュレーションを見たいなあ」と思ったのが今回ウェッブに手を出すきっかけだったので流体シミュレーションを実装します。2Dの流体シミュレーション(WebGL)は無限にあるのですが、3Dは全然ありません。まったく気合いの足りないことです。

というわけで、とりあえず2Dの流体シミュレーションを実装→3Dのシミュレーションに拡張、という手順を踏むことにします。

2Dの流体シミュレーションは、特に頭を使いたくなかったので、Jos Stam先生のStable FluidsをそのままGLSLに移植しました。ググればいくらでも情報が出てくるでしょう。基本的に、ナビエ・ストークス方程式を離散化して解いてるだけですが、移流の解決のためにセミラグランジュ法を使っているのでいい感じに安定になります。

安定なのはいいんですけど、セミラグランジュ法はウンコみたいに数値拡散が起こってしおしおになります。よって、今回はナビエ・ストークス方程式の拡散項は無視してます。数値拡散だけでもやばいのにまともに拡散項なんて解いている場合ではありません。この方法はBridson先生も推奨していたような気がします。まあ移流スキームをもうちょい賢い感じにすればいいんですけど、今回の本旨じゃない気がしたのでこの辺で終わりにします。

さて、WebGLで流体シミュレーションみたいなGPGPUじみたことを行うにはどうすればよいか?という話です。WebCLみたいなのもあるみたいですがとりあえずWebGLだけ使うとすると、レンダーターゲットを二枚用意してピンポンするのが一番です。

このようにすると、二次元の離散化格子はそのままテクスチャの各テクセルに対応するのでシミュレーションも直感的に実装できます。境界条件をちゃんと設定する必要はありますが、どうせWebGLのテクスチャボーダーの処理は二種類くらいしかないので適当に指定します。

テクスチャフォーマットは、RGBAのFLOATテクスチャにしました。これは、本当は拡張機能なのですが、さすがにUnsinged Byteのフツーの8ビットテクスチャだと精度が全然足りないし、パックとかアンパックを組み合わせ始めると泥沼式に面倒さが増していくのであきらめて拡張機能を使いました。

3D流体シミュレーション

というわけで、GLSLへの移植と結果の確認自体はまあすぐできました。やるだけですね。問題はここからです。WebGLは先進的なテクノロジーにも関わらず3Dテクスチャをサポートしてないらしいのです。そしたらどうやって3Dシミュレーションすればいいのでしょう。

まあ実はそんな大したことはありません。3Dテクスチャを2Dテクスチャ上に展開してマッピングしてやればいいのです。シミュレーション空間が64x64x64だとすると、512x512の2Dテクスチャを確保して、その上に64x64のタイルを縦横8枚ずつならべれば64x64x64相当のテクスチャとみなすことができます。

この手の処理は大概テクスチャ境界が面倒になるものですが、FLOATテクスチャは最近傍フィルタしか使えないのでどうにでもなります。

そしたら、あとは2Dシミュレーションを3Dに拡張しつつテクスチャサンプリング部分を自前でアドレッシングするようにするだけです。ヤッター!

レンダリング

シミュレーションが首尾よくできたら最後にレンダリングです。これが結構面倒です。ボリュームレンダリングの手法は無数にあります。

しかし、最初考えてた方法(光源方向からシャドウボリュームテクスチャを生成していい感じにやる)は、WebGLがどうやらマルチレンダーターゲットに対応していないらしいので破綻しました。まあ対応してたところで、イマイチなんですけど。

しかたないので普通にカメラからレイマーチング+光源にも各サンプル点からレイマーチングという方法にしました。この方法だと、サンプリング数がO(N^2)(Nはサンプル数)みたいな感じになりあまり筋がよくないのですが、プライマリのレンダーターゲットの解像度を半分にしてみたりきちんとAABBで枝刈りしたりみたいなことをしていったら結構速度が出るようになったのでそれでよし!としました。

高速化とか

シミュレーションステップの順番を細かく変えたり、圧力項を解くためにガウスザイデルする際、前フレームの結果を使い回りしたり、みたいな涙ぐましい最適化をします。まあまあ速くなります。

おわり

まあなんとかシミュもレンダリングもできました。dat.gui.jsとかStats.jsとか、便利ライブラリを突っ込むとそれっぽくなってかっこよくなります。組み込みも簡単です。

だいたい、一日ちょっとくらいで絵が出て、あとは細かい調整って感じでしたし、どんどんWebGLすればいいんじゃないでしょうか。

シミュレーションを放置しておくと割と爆発したりするんですが、これは色々シミュレーションを雑にやってるせいです。TODOってことで。

githole/webglSmoke · GitHub

一流グラフィックスプログラマへの道~リアルタイム編~

はじめに

こんにちは。holeです。
この記事は第三回レイトレ合宿アドベントカレンダーです。

今回は一流グラフィックスプログラマ(リアルタイム)になる方法を探ってみました。
一流のことは一流の会社を調べるのが一番!ということで海外15社(18種)、国内4社(4種)のグラフィックスプログラマの募集要項を調査しグラフィックスプログラマに求められるスキルを考察してみました。ゲーム会社に偏ってしまいましたが、やはりリアルタイムCGはゲーム屋に一日の長があるためそのようなチョイスになっています。

 対象の会社

対象としたのは以下の会社・職種です。他の会社については、グラフィックス系のプログラマの募集を明示的に行っていなかった(2015/06時点)ため載せていません。

海外

Naughty Dog/Graphics Programmer
Infinity Ward/Sr. Rendering Enginner
Sledgehammer Games/Sr. Rendering Enginner
Sledgehammer Games/Rendering Enginner
Bungie/Graphics Programmer (Sr. or Lead)
Rockstar North/Jr. Graphics Programmer
Rockstar North/Sr. Graphics Programmer
Bethesda Game Studios/Graphics Programmer
DICE L.A./Sr. Rendering Enginner
Crytek/Sr. Rendering Enginner
Crytek/R&D Graphics Enginner
Epic Games/Lead Rendering Programmer
Unity Technologies/Graphics Programmer
Santa Monica Studio/Sr. Engine/Graphics Programmer
Firaxis/Graphics Programmer
Avalance Studios/Sr. Graphics Programmer
Codemasters/Graphics Programmer
Quantic Dreams/Sr. Graphics Programmer

日本
スクウェア・エニックス/第3BD/3Dグラフィックスプログラマー
カプコン/レンダリングエンジニア
シリコンスタジオ/グラフィックス開発エンジニア
Tango Gameworks/グラフィックプログラマー

 それぞれの募集について、要項をまとめました。似たようなスキルは適当にまとめました。精度は何とも言えないところですが、まあ感じをつかむということであんまり統計的データとしての意味はないでしょう。

必須スキル

上位を占めたのはやはりGPU&グラフィックスAPIの知識C/C++の知識でした。あまりにも当然の結論ですね。前者はかなり大ざっぱな分類ですが22ポイント、後者は19ポイントでした。

ゲーム系のリアルタイムグラフィックスプログラマで募集かけてんだからGPUとかDirectXとかシェーダの知識が要求されるのはあまりにも当然ですね。書き忘れてる会社とかはさすがに存在しませんでした。

Crytek/R&D Graphics Enginnerは少し面白く、「特にDirect3Dと明記されていました。CrytekといえばXBoxOne独占タイトルとしてRYSEをリリースしたのは記憶に新しいですが、開発においてMS陣営との結びつきが強いためにD3D知識が重視されてるのかもしれません。

C/C++知識については、現状、AAAタイトルの開発はC++を中心に行われているからでしょう。世の中には無数のプログラミング言語がありますがいわゆるコンソール開発を中心としてプロダクションにおけるゲーム開発はC++が支配的です。ハイレイヤーはまだしも、グラフィックスプログラミングはかなりローレイヤー寄りに分類され、場合によってはエンジン開発と密接にかかわることからC++が選ばれるのも納得です。

重要スキル

続いて、多くの会社が要求スキルとして指定している重要なスキルについてです。上位を占めたのはコンピュータグラフィックス知識全般3D数学ローレベルなデバッグ・最適化の技術です。

グラフィックス知識はかなり漠然とした話ですが、モダンなレンダリング技法(大域照明や影、ポストエフェクトといった全て)のアルゴリズムについての知識といった形になるでしょうか。こういったスキルについて明確に要求していない会社も暗に要求していると考えられるのでほぼ必須スキルになりますね。

次に重要度の高いのが3D数学です。最近のグラフィックスは高度化が進み、それに伴い必要とされる数学力の水準も上昇傾向にあります。多くの会社が明確に「Strong Math Skill」を要求していました。あくまで3D方面のCG数学(線形代数とかその他)という意味合いなのでしょうが、とくに何の指定もなく「数学」と言い切っている会社もあります。

カプコンレンダリングエンジニアは歓迎条件として「光学、数学、物理学の深い知識 」を挙げています。これは、近年の物理ベースレンダリングの流行に伴い光学・物理の知識の重要度が上がっていることの顕れでしょう。しかし、海外の会社は数学を要求することはあっても光学や物理については特に言及のある会社はありませんでした。強いて言えば、Avalance Studios/Sr. Graphics ProgrammerはPhsyically Based Renderingの知識を歓迎条件として挙げていたくらいです。

Infinity Ward/Sr. Rendering Enginner(以下、リンク切れの可能性あり)は

* Strong 3D math, particularly as it relates to modern rendering techniques such as energy. conservation, alternate basis representations, voxelization, and path tracing etc. 

としてあります。パストレーシングくらいは書けないとCall of Dutyは作れないということでしょうか。こういう会社は他にはありませんでした。レイトレをはじめとしたオフラインレンダリングの知識を要求スキルに挙げている会社はほぼありませんでしたが、あると便利な裏スキルに間違いないという確信を持っているので皆さんもレイトレをしましょう。

ローレベルなデバッグ・最適化技術は、やはりグラフィックスプログラマには求められることが多いようで、14ポイントでした。グラフィックスは速度にシビアなケースが多いので当然でしょう。また、各種のグラフィックスプロファイリングツールの習熟を求める会社もかなりの数存在しました。

学歴

今回調査して驚いたのは、コンピュータサイエンスの学士号を要求する会社がとても多い(海外)ということでした。具体的には以下のように記述されます。(Naughty Dog/Graphics Programmerより)

Bachelor’s Degree in Computer Science or equivalent work experience

 要するにコンピュータサイエンスの学士号またはそれに準ずる経験の持ち主であること、を要求してるわけです。日本のゲーム会社は学歴不問としてる場合が多いのでこれはちょっと新鮮でした。別に学士号を持ってなくても相当の能力を示せば良いことになっているので別に門戸が狭いわけではないと思います。

しかし、Quantic Dreams/Sr. Graphics Programmerは明確に

Graduated with a Master Degree in Computer Sciences (Engineering school)

としています。このような、学歴に関する要求は全部で14ポイントでした。ちなみに、Rockstar North/Jr. Graphics Programmerは数学の学士号でもOK!としてます。学歴に関する条件が無い海外のゲーム会社は、Rockstar North/Sr. Graphics Programmer、Epic Games/Lead Rendering Programmer、Unity Technologies/Graphics Programmer、Avalance Studios/Sr. Graphics Programmerでした。エンジン開発系の会社が二社出てきたのは少し面白いですね。

コミュ力とか自主性

コミュ力もかなり重要度は高そうです。何らかの形でGood communication skillを求める会社が多いです。Bethesda Game Studios/Graphics Programmerは対人関係スキルとコミュニケーションスキルをわざわざ別の項目として記述するほどです。ゲーム会社といえやはり社会的能力はあったほうが良いということでしょう。

また、Self motivationという単語を使う会社も多めでした。自主的に行動し、問題に立ち向かい解決する、そういう人間が高く評価されるわけです。

過去の経験

今回調べたのは基本的に中途向けの募集要項なので過去の経験も重要になります。結構具体的に要求している会社も多かったです。

まず、コンソールやPCでのゲーム開発経験を求めるケースが10ポイントに上りました。日本の会社が内3ポイントを占めており、日本においては前職の経験がかなり大事になりそうです。一方、海外ではコンソール経験を明確に求めていないケースも多くありました。海外においてはCG産業はゲーム以外にも幅広く広がっているため、多様な人材を求めているのかもしれません。

経験年数については、普通のプログラマよりもシニアプログラマの方が長め、といった感じです。五年以上のグラフィックスプログラミング経験は8ポイントにも上りました。特に、Crytek/Sr. Rendering Enginnerは少なくも二年間のシニアプログラマ経験を要求しておりなかなかに水準の高いものになっています。

Sledgehammer Games/Sr. Rendering Enginnerは七年以上のグラフィックスプログラミング経験を要求しており今回調べた中では最長でした。

ゲーム開発への情熱

一般に、欧米のゲーム会社は分業が進み自分の専門領域に特化していると言われています。そのためか、一部には海外では個々のプログラマレベルではゲームデザインにコミットしないと考えている人もいるようです。しかし、実際は募集要項に面白い、良いゲームを開発するということについての貢献を求められるケースが見受けられます。実に半分近くの会社で何らかの形でゲームや、ゲーム開発への情熱を要求されています。例えば以下のような形です。Naughty Dog/Graphics Programmerより)

Passion for playing and developing exceptional games 

 また、Bethesda Game Studios/Graphics Programmerは過去のBethesda Game Studiosのゲームのプレイ経験を求めています。

その他の重要そうなスキル

読みやすく、移植しやすく、信頼性の高い最適化されたコードを書ける人間を明示的に求める会社もいくつかありました。特に、Santa Monica Studio/Sr. Engine/Graphics Programmerはドキュメントをちゃんと書きプログラムのテストを書き高い品質のコードを書くことを要求しています。

次世代機(PS4、XBoxOne)への移行が急激に進んでいる今、次世代機の経験も貴重な能力です。五つの会社が次世代機における開発を重要なスキルとしてとらえていました。

ゲームにおけるグラフィックスはシステム全体に広がるため、グラフィックスプログラマはエンジン部分と密接に連携しなければなりません。実際、エンジンプログラマとして募集している会社もあります。そこで、ソフトウェアデザインの知識や大規模なコードの経験を求める会社もあります。明確にリーダーとしての能力について示す必要がある会社もありました。

基本的に欧米の会社を中心に調べたのですが、世界中から人があつまるような会社は英語スキルについても記述がありました。CrytekとUnity Technologiesです。また、スクウェア・エニックスカプコンも同様でした。コンピュータグラフィックスの本場は欧米なので、最新技術を追うために英語は避けられません。特に、日本のエンジニアは英語スキルを求められるでしょう。

グラフィックスプログラマはゲーム内のアセットを作る、いわゆるアーティストとも密接に連携する必要があります。Rockstar North/Sr. Graphics Programmer、Epic Games/Lead Rendering Programmer、Avalance Studios/Sr. Graphics Programmer、Tango Gameworks/グラフィックプログラマーはアーティストとの連携について明確に記述がありました。やはり、リード、シニアクラスになると他チームとのコミュニケーションも重要になりそうです。

小ネタ

Sledgehammer GamesとBungiePS3のプロセッサであるSPUの開発経験を求めていました。これは、彼らの作るゲーム(Call of DutyとDestiny)の主要マーケットとしてPS3がまだまだターゲットに入っているということの証拠ですね。あるいは単に昔の記述を削除し忘れただけなのかもしれませんが。

募集要項の項目の内容と数にも注目です。欧米の会社の要綱は項目数が多く、かつかなり具体的な内容になっています。一例を挙げると、Quantic Dreams/Sr. Graphics Programmerは全部で18項目あり、しかも以下のように具体的な手法にまで踏み込んでいました。

- Excellent knowledge of various rendering techniques such as:
o SSAO
o Deferred Shading technical
o Shadows
o Global Illumination
o Particles
o Etc. .  

他の会社も、項目数が10を超えることは珍しくありません。欧米の会社の項目数の平均は約11.8個でした。一方、日本の会社の項目数の平均は9.25個でした。これも、BethesdaグループのTango Gameworksが押し上げた結果です(16個)。こういうところにも微妙な文化の違いを感じますね。 

まとめ

というわけで各ゲーム会社のグラフィックスプログラマの募集要項を調べてみました。これらを全て満たせば自ずから一流グラフィックスプログラマになれることでしょう。

とりあえずC++・数学・GPU知識・グラフィックスAPI・英語あたりを押さえておくのが重要そうです。

レイトレ本書評10連発

このポストはレイトレ合宿2アドベントカレンダーの10回目です。

 

皆さん、レイとばしてますか?なんと残り時間も12日というわずかなものになってきました。あれほど沢山時間はあったのに、いったいどこへ消えてしまったのでしょうか?それは誰にもわかりません。

さて、今から本を読んだってもう遅いかもしれません。しかし、例え合宿が終わっても日々は続いていき、レイは飛び、CGはレンダリングされるのです。今回の合宿で得た経験を生かし、さらなる飛躍を遂げるためにも温故知新、過去の知に触れることは重要なことです。そこで、今回は独断と偏見で選びだした10冊のレイトレ(関係)本について書評を加えていきたいと思います。これからレイトレの本をいっちょ買おうと思っている人の参考になればと思います。

 

CG Magic:レンダリング
CG Magic:レンダリング

CG Magic:レンダリング

 

 一冊目はCG Magicです。この本は倉地さんという長年CG業界でテクニカルなライターをされていた方が書かれた本です。日本のレイトレ本業界は惨憺たる有様であり、レイを飛ばしてるだけ、それも業界の主流の手法は無視、みたいな感じなのですが、この本は基本的にアカデミックなCG業界における手法をきちんと押さえてある「日本語の」書籍です。

扱っている内容も、基本的なRadiometryの話からレンダリング方程式、GPU、ボリュームレンダリング、表面化散乱といった幅広い内容に触れています。また、イメージベースレンダリングHDRに関するあれこれ、さらにはBRDFの測定やPrecomputed Radiance Trasnferにまで話は及んでいます。

あくまでサーベイ的内容なので個々の手法を詳しく知るにはさらに各文献を当たる必要がありますが、レイトレをはじめレンダリングに関する諸技法の概略をつかむにはかなり良い本だといえます。日本語なので英語はちょっと・・・という人にもぴったりです。

フォトンマッピング
フォトンマッピング―実写に迫るコンピュータグラフィックス

フォトンマッピング―実写に迫るコンピュータグラフィックス

 

 これも日本語の本です。青本とか呼ばれてるとかいないとか。いわゆるグローバルイルミネーションも含んだまっとうな物理ベースレンダリングについて書かれた本で、フォトンマッピングの開発者であるJensen先生の書かれたフォトンマッピングの解説書です。

Jensen先生が書かれただけのことはあり、内容は非常に充実しています。これさえあればフォトンマッピングの実装はまったく容易なものになるでしょう。巻末にはコードまで付属しています。この本を読んでフォトンマッピングを実装したという日本の人はとても多いようです。一方、フォトンマッピング本であるが故にフォトンマッピング以外のレンダリング手法、たとえばパストレーシングや双方向パストレーシング、メトロポリスライトトランスポートといった手法については軽く触れる程度でほとんど解説らしい解説はなく、他の文献を当たる必要があるかもしれません。また、BVHのようなレイトレの加速構造をはじめ、「レンダラを書く」という点のサポートはあまりありません。

出たのが2002年ということで近年のフォトンマッピング系手法の進化には対応できていませんが、それでも基礎中の基礎であるオリジナルの手法を学ぶのには非常に役に立つと思います。日本語で書かれたグローバルイルミネーションアルゴリズムの本としての価値も高いと言えます。

Ray Tracing from the Ground Up
Ray Tracing from the Ground Up

Ray Tracing from the Ground Up

 

 続きまして金魚鉢の本で、英語の本です。レイトレーシングによるレンダラに関する解説を、一章につき一つトピックをとりあげてソースコードを交えて行う、という趣旨の本になっていて、幅広いトピックを扱っています。

アンチエイリアスからサンプリングの方法、DoFから光の物理、アンビエントオクルージョン、エリアライト、空間分割、グローバルイルミネーション、プロシージャルテクスチャなどなど、思いつくことは全部入れました、という感じです。

レンダラの設計やトピックの選定を始め、どうも(後で取り上げる)"Physically Based Rendering"を平易にしたバージョンという印象があります。レイトレはじめたばっかりで、ちょっと進んだテクニックや知識を得たい!という人には非常におすすめの一冊です。コードと解説が近いのがうれしいですね。また、近いうちに第二版が出るそうです。

Advanced Global Illumination
Advanced Global Illumination, Second Edition

Advanced Global Illumination, Second Edition

 

 名前の通り、グローバルイルミネーションに関する先進的なアルゴリズムを取り上げた本・・・かと思いきや前半は非常に丁寧にグローバルイルミネーションの原理、理論や方法論を解説してある本です。後半は最先端のグローバルイルミネーションアルゴリズムの解説、ということになっています。

とにかく前半部の価値が非常に高い本です。レイトレ本は世の中にたくさんありますが、Radiometryやレンダリング方程式のような基礎中の基礎、みたいなことについて細かく詳しく分かりやすく解説されている本は案外少ないものです。この本は、この点については非常に優れており、私もレイを飛ばし始めたころは貪るように読んだものです。練習問題なんかもついているので解いてみると良い勉強になります。一方、後半部は最先端といいつつやや昔の本であるがゆえに今となっては若干古くなってしまっている部分も否めないでしょう。(それでも有用度は高いですが)

少し進んだ物理的なレンダリングの基礎をやりたい人向けですね。

Realistic Ray Tracing
Realistic Ray Tracing, Second Edition

Realistic Ray Tracing, Second Edition

 

 基本的にRay Tracing from Ground Upと同じような感じの本です。レンダラのコード解説を、一章につき一トピックくらいの感じでおこなっていきます。この本はBounding Volume Hierarchyについても触れてるのでそこだけ違いますが、まあGround Upを買っておけば間違いないんじゃないかという気もします。ページ数はこっちの方が少ないので、とにかく素早くいろんなことを知りたい!というときはこっちを買って一気に読むと結構知識が増えると思います。

Physically Based Rendering: From Theory to Implementation
Physically Based Rendering, Second Edition: From Theory To Implementation

Physically Based Rendering, Second Edition: From Theory To Implementation

 

 出ました。超有名なレイトレ本、通称PBR本です。PBRTとかも呼ばれてます(PBRTはこの本とセットのレンダラの方であるという説もあります)。日本でもこの本だけは知っている人が多かったりしますね。

しかし、この本は1000ページ以上ある長大なもので、カジュアルに「ちょっとレイでも飛ばしてみっか~」という人間が買ってもどうしようもない可能性があります。この本もレンダラのソースコードを部分ごとに取り出して各トピックごとに解説を加えていく、というものですが、とにかく扱っている範囲・量が膨大なのでまったくの初心者がいきなりこの本を開いても全部読み終わるまでレンダラを作れない!ということになりかねません。

もちろん、「俺は1000ページくらい楽勝で読んで、レンダラを作ってやるぜ!」という意気込みの方は問題ありませんが、そうでもなければこの本「だけ」に頼ってレンダラを書くのは結構大変だと思います。

扱っている内容、量、質はまったく申し分なく、ありとあらゆるレイトレーシング・レンダラに関するテクニック・技術・理論が詰まっている非常に優れた本です。私もことあるごとに開いています。しかし、とりあえずレイトレ書いて絵を出したい!みたいな人は上で紹介したようなもう少しカジュアルな本を使いつつ、補助的にこの本を使う、という作戦が一番いいんじゃないかと思います。1000ページって結構多いよ。

 Computer Graphics: Principles and Practice
Computer Graphics: Principles and Practice (3rd Edition)

Computer Graphics: Principles and Practice (3rd Edition)

  • 作者: John F. Hughes,Andries van Dam,Morgan McGuire,David F. Sklar,James D. Foley,Steven K. Feiner,Kurt Akeley
  • 出版社/メーカー: Addison-Wesley Professional
  • 発売日: 2012/12/28
  • メディア: ハードカバー
  • クリック: 1回
  • この商品を含むブログを見る
 

 これもかなり有名な本ですね。こちらはレイトレ本というよりかコンピュータグラフィックス全般について取り扱った本です。豊富なソースコードと実例に基づき、フルカラーの解説が非常にありがたい内容になっています。

カバーしている範囲は、単純なラスタライズみたいな話からジオメトリや信号処理、シェーディングから色彩に関する話など、コンピュータグラフィックスについてのあらゆる話、といった感じです。特にジオメトリにかんしては、専門書はどれもかなり難しくなるためこういう基礎についてちゃんと扱った本はかなり便利です。

レイトレについてももちろんカバーしており、パストレーシングやフォトンマッピングの実装に関する示唆を与えてくれます。ただし、あくまでCGの教科書的な本でありレイトレ専門の本ではないためやや物足りないと感じる人もいるかもしれません。

Production Rendering
Production Rendering: Design and Implementation

Production Rendering: Design and Implementation

 

 この本は名前の通り、プロダクション向けのレンダラについての本です。プロダクション向けのレンダラは、研究で作るレンダラや個人で作るレンダラとは違います。そこにはプロダクションのための、泥臭い機能や強く実用的な機能が多分に盛り込まれていきます。(わりとRenderMan系です)

扱っている範囲は、全体のアーキテクチャから、ジオメトリ、シェーディング、シェーダのコンパイラ設計、レイトレーシングに関するあれこれ、グローバルイルミネーション、画像のリコンストラクション、その他あらゆる実用的なテクニックなどなどです。

グローバルイルミネーションひとつとっても、イラディアンスキャッシュのような実用度の高い手法が取り上げられていますし、実用的なテクニックに至ってはpowやlogの高速化にまで話がいたります。

結局、プロダクションという出口がレイトレには必要だという側面もあります。こういう本を買ってみてプロダクションではどのようなレンダラが設計されているかに触れてみるの面白いかもしれません。

 色彩工学
色彩工学

色彩工学

 

 ここからはレイトレとは直接関係ないながらも、非常に重要な知識を与えてくれる本の紹介です。まず、色彩工学についての本です。

色彩工学とは、人間の色の知覚を工学的に取り扱う分野です。色の知覚は本来個人差が強い極めて心理的な要素ですが、しかしながら色というのは普遍的に溢れており工学的に取り扱う必要があります。色彩工学はこのような問題を解決するための学問であり、この本を読めば、我々が普段漠然とRGB値~とか言って取り扱っているものにも全て工学的背景が存在するということがわかることでしょう。

物理ベースのレイトレも、つまるところ光の物理シミュレーションなわけで、最終的な画像にする際には色彩工学の知識が大いに役に立つでしょう。

 ヘクト光学1
ヘクト光学1 基礎と幾何光学

ヘクト光学1 基礎と幾何光学

 

 最後は「光学」です。これは完全な教科書です。ヘクトの光学はいくつかありますが、我々はレイを飛ばしたいので幾何光学について扱った光学1が良いでしょう。

この本には光に関する物理的側面がきちんと解説されています。物理ベ~ス~などといいつつそもそもの光に関する取扱いや解説は漠然としていることが多いレイトレ業界ですが、この本はそういった疑問に対する答えを与えてくれること間違いなしです。

とりあえず一冊持っておくと「あれ、この現象って(物理的に)なんだっけ・・・」となったときにパッと調べることができて便利な本です。

まとめ

さて、レイトレ本書評10連発、いかがでしたでしょうか。自分が興味のある本、面白そうだと思った本をとりあえず読んでみるときっとレイを飛ばすのも捗ることになるでしょう。