レンダリングエンジンの開発を始めた。

 

レンダリングエンジンの開発を始めた。

 今は割とやる気があるので、このやる気が継続するよう、開発日記をつけるためにブログの開設をした。

 

 私はゲームプログラマであるので、レンダリングとは一般的なほかのエンジニアよりも縁が深い立ち位置だが、今まではレンダリングという技術を雰囲気でしかわかっていなかった。いや、真剣に学び直した今考え直してみると、実は1ミリもわかっていなかったようにも思う。

 

 そもそもレンダリングエンジンは、ゲームエンジンをレイヤー分けした時、割と低レイヤーな機能に属する。勿論最も高いレイヤーの機能はマウス操作で完結するエディターだ。

 

 例えば、Unityが外部アセットから読み込んだポリゴンを内部でどのように展開して描画してるのかとか、どんなライティングアルゴリズムを使っているのかとか、そんなことを気にしなくてもゲームは作れる。

 

 ライトをたくさん置くと死ぬほど重くなるし、リフレクションやシャドウとかはなるだけ静的にベイクしないと死ぬ。半透明オブジェクトはディファードレンダリングで描画する有力な手段がないのでコストが高い。画面外のオブジェクトはカリングされるので描画コストについては考慮しなくて良い。

(余談だが、一部モバイル端末のグラフィックスAPIはMRTに対応していないらしく、Unityモバイル向けビルドではディファードレンダリングが使えないらしい。正気か?)

 

 こういったことはどのゲームエンジンでも共通で、皆経験則的に理解している。だが、実装の詳細まで把握している人間は一体どれだけいるのだろうか。優秀なゲームエンジンが多くある今なら尚更だ。あるいは、コンシューマ全盛期にまで遡ったとして、その時期は固定機能シェーダが基本だったのではないだろうか。自力でバーテックスシェーダやピクセルシェーダを使い、物理ベースレンダリングを実装したことのある人間はゲームエンジニア人口のどれほどになるのだろう。

 

 少なくとも、私はその他大勢の人間だった。リアルタイムレンダリングという技術への理解が浅いまま、cocos2dxやUnityを使いゲームを開発していた。

 

f:id:riyaaaaasan:20180301204043j:plain

 

 だが、ある時仕事の都合で、UnrealEngine4のソースコードを読む機会があった。主にレンダリングのコードをだ。その時、私の中に衝撃が走った。リアルタイムレンダリングという技術に、ただただ感嘆した。cocos2dxもオープンソースで、プルリクを送った経験があるくらいにはエンジンソースコードを読んでいたが、その時とは比にならない感動を覚えた。

 

 率直に言って、レンダリングフローの流れを掴み、どのクラスでどんなことをしているのかは分かっても、その実際の処理の詳細まで理解することは叶わなかった。知識が圧倒的に足らなかった。

 

f:id:riyaaaaasan:20180301205721j:plain

 

 オープンソースのエンジンを使っていながら、その中身を理解せぬままに上部だけをすくい取り開発をすることが、果たしてエンジニアにとって正しい姿なのだろうか。少なくとも私は違うと思っている。

 

 なにはともあれ、リアルタイムレンダリングの正しい知識を身につけるべきだと思った。

 

 そう思い、私はフルスクラッチレンダリングエンジンを開発することにした。

 三角形ポリゴンを表示するところからだ。ちなみにDirectX11を使っている。本来ならばグラフィクスドライバAPI部分は抽象化して、クロスプラットフォームに対応するべきなのだろうが、私はプロダクトが作りたいわけではなく、レンダリングが学べればよいので、Windowsに依存する形にした。あと楽なので。VulkanやMetal、OpenGLなど、それらすべてを網羅するには、本質的ではない煩雑な学習コストがかかる...。

 

 仕事の合間に作業を進めつつ早1ヶ月、簡易的なものなら一通り動いている。だが、道のりは長く険しい。

 githubのコミット履歴を見ると、大体書いたコード量はライブラリ等を除くと1万行くらいだ。しかも消したり書いたりしてるので実質残っているコードは5千行くらいな気もする。

 

f:id:riyaaaaasan:20180301215852p:plain

 

 開発日記と言いながら、ほとんどポエムになってしまった。

 次は、現在までの進捗をまとめることにする。