グラフィックスプログラマーを目指すならこれだけは押さえろ!必須学習ロードマップ
What to learn to be a graphics programmer
What to learn to be a graphics programmer
グラフィックスプログラミングの世界へようこそ!この道を目指すなら、まずは以下のスキルを段階的に習得することをおすすめします。1. 数学(線形代数、ベクトル、行列演算は避けて通れません) 2. C++(パフォーマンスを追求するなら必須です) 3. グラフィックスAPI(まずはOpenGLやVulkan、あるいはDirectX 12を触ってみましょう) 4. GPUアーキテクチャの理解(並列処理の仕組みを知ることが重要です)。まずは小さなレンダラーを一から作ってみるのが一番の近道です。頑張ってください!
基本的なデザイン原則や、人間がどう知覚するかという特性についての言及がないのはちょっと驚き。私の兄は90年代から00年代にかけて有名なコンピュータゲームのプロダクションアーティストだったんだけど、視覚的なセンスが全くない、あるいはアーティスト側の意図を理解しようという好奇心すらないプログラマーやマネージャーたちのこと、いつもこぼしてたよ。グラフィックスは専門外だけど、ミュージシャンでサウンドデザイナー兼プロデューサーの立場から言うと、これまで出会った中で最も効果的で影響力のあるオーディオDSPエンジニアはみんな、音楽の基礎や音の物理学・音響学、そしてデジタル処理と人間の知覚・解釈の境界にある落とし穴をしっかり理解しているね。
Khan Academyに興味深いグラフィックスプログラマーがたくさんいると思うよ。彼らはProcessing.jsを使っているんだ。https://www.khanacademy.org/computing/computer-programming/browse
この人のアートはなかなか良いよ:
https://www.khanacademy.org/profile/kaid_101904269317089495055459/projects
今の時代、誰かにグラフィックスプログラミングの道を勧めるかと言われたら、正直微妙かな。
私が始めたのは2001年で、ちょうどNvidiaの最初のGeForce 1(「Gigatexelシェーダーカード」)が発表された頃。それ以来、この分野は驚異的なスピードとイノベーションで進化してきて、本当に圧倒されるよ。25年前にできたことと比べたら、今の技術はマジでヤバい。
ただ、この凄まじさには大きな「けど」がある。進化のスピードが本当に恐ろしいレベルなんだ。NvidiaはAIを使ってシーンやアセットに自動的に影響を与える機能を発表したけど、昔はそんなことがリアルタイムで実現できるなんて夢にも思わなかった。
今この分野で「ちゃんとしたプロ」になるのが可能なのかは正直わからない。言い方を変えるなら、「現代のジョン・カーマックはどこにいる?」ってこと。彼はハードウェアから全てを引き絞り出すような、コミュニティの裏側に隠れたアイデアを使うことで有名だった。でも今は、彼のような人間が競争優位性を保つのは難しい(彼は過去の遺産で生きている状態だ)。なぜなら、分野が広大すぎて進化が速すぎて、次なる彼になるチャンスなんてないからね。
何でもかんでもキャリアや仕事に結びつけようとする風潮があるよね、特にML(機械学習)が絡むとなおさら。「グラフィックスプログラマーになる」んじゃなくて、「グラフィックスプログラミングをやってみる」ぐらいの感覚じゃダメかな?最初は単純なことをやってみて、それがGPUへの命令のやり取りだってことに気づけば、そこからクレイジーなコンセプトを積み上げていけるようになる。小さな山を登るようなもので、ある時ふと視界が開けて、「うわっ」ってなる瞬間があるんだよ。可能性とか実験したいことが山ほど見えてくるはずさ。
線形代数の手っ取り早いチュートリアルが必要な人がいたら、私が書いたこの4ページの印刷用資料をチェックしてみてよ:
https://minireference.com/static/tutorials/linear_algebra_in_4_pages.pdf
SymPyを使ったコード例をまとめたノートブックもここにあるよ: https://github.com/minireference/noBSLAnotebooks
私が作成して今もメンテナンスしているA-Frame (aframe.io)を紹介するよ。もう10年も3Dグラフィックスを学ぶための入り口として機能している。コミュニティも最高だよ、自分で言うのもなんだけどね(笑)。学んだことを共有して、フィードバックをもらって、認知度を上げるにはWebは最高の場所さ。ここからプロの3Dグラフィックスエンジニアになった人もたくさんいるよ。
グラフィックスプログラマーじゃないけど、C言語でレイトレーサーを作った時はすごく楽しかったよ。面白い数学だし、意外とシンプルなんだ。
今度はブラウザベースのレイトレーサーをゼロから作り直してみようと思っているんだ。
その前に、まずはWebGLとCanvasを使った2Dのトップダウン型グリッド戦略ゲームと、そのエンジンを完成させているところさ。
グラフィックスプログラミングにおける「色」、特に変換関数(時々トーンマッピングと混同されるけど)の概念を理解するのに少し苦労したんだ。
カラーマネジメント全般について書かれたこの記事はすごく良くて、グラフィックスプログラミングに必要な基礎知識と素晴らしい交差点になっているよ:
https://chrisbrejon.com/cg-cinematography/chapter-1-color-management/
やりたいのはゲーム制作?それとも3Dエンジン開発?
ゲームを作りたいなら、既存のエンジンを使うことだね。Unreal Engine、Unity、Godot、Bevyなんかがおすすめ。ピクセルをどう動かすかという低レイヤーじゃなくて、グラフィックスの高度な問題について学べるし、本当の難関である「どう面白くするか」に集中できるからさ。
もし3Dエンジン開発をやりたいなら、世の中には質の悪いゲームエンジンが多すぎるということを知っておいて。私のいるRust界隈だけでも、挫折したレンダラーが3つ、未完成が1つ、そしてBevyエンジンの中にあるやつがある。これらが主なプロジェクトだ。他にも「ゲームエンジンを作ってみる」というプロジェクトは山ほどある。最初のレンダラーにたどり着くのに約2年はかかるし、詳細でダイナミックな大規模シーンを実現するのはもっとずっと大変な作業だ。最初のデモと実用的なエンジンの規模感の違いを甘く見ちゃいけない。
仕事を探しているなら、ゲーム業界は厳しいってことを覚悟して。給料は安いし、労働時間は長いし、プロジェクトが終われば仕事もなくなる。ハリウッドみたいに、やりたがる人が山ほどいる世界なんだ。それに今はメタバース熱が冷めたせいで、経験豊富な人材が溢れ返っているよ。
あとはモバイルかな。すべてが詰め込み作業になる。画面は小さいし、計算能力もGPUも足りない、バッテリーも持たない。
だから最近のインディーゲームのほとんどが2Dなんだ。2Dなら現実的だからね。よくHTML/JavaScriptで作られてるよ。
なぜか知らないけど、グラフィックスって趣味のプログラミングのトピックとしては一番人気があるよね。