ゲーム制作者になるための3Dグラフィックス技術
3D技術の発展に黎明期からDirectXが関わってるからこそのWindowsゲーム強い DirectX 8
プログラマブルシェーダ対応
DirectX側にパイプラインが準備されていて、その順に実行される。なのでシェーダを書いたらそのフェーズに機能を差し込めるイメージだと思った = 専用回路
GPUのシェーダユニットでピクセルシェーダ何基...と固定的に設計すると無駄が多くなる
パイプラインで順番に通過するイメージとして、どこかのユニットで詰まりがあれば遅くなる
それなら汎用的なシェーダユニットにした方が合理的なのでは? → 統合型シェーダアーキテクチャ → GPGPUへの道
---
初期のPCでは、こうした計算は全てCPU側の仕事で、色調変更後の値を1画面分計算してから、おもむろにビデオカードのフレームバッファに書き込んでいたわけだが、言うまでもなくこれでは画面更新に時間がかかってしまう。そこでグラフィックスコントローラ側にも簡単な演算器を搭載することで、こうしたピクセル値の変更を高速に処理しよう、というのがそもそもの経緯である。
つまりDirectXに対応する製品(GPU)みたいな概念
DirectX 6までの世代では、極端な事を言えば2Dグラフィックの延長にある。もともと3Dゲーム類は、まず仮想的な3D空間内に描画したい「物」(オブジェクト)を配置し、次いでその物を「どこからどう見るか」に相当するビューポートというものを配置、最後にその「物」にどう照明があたるかを設定する。これはDirect 3Dに限らず、CGでも何でも3次元のモデリングをする際には一般的な手順であるが、DirectX 6まではこの作業は全てCPU側(=ソフトウェア)で行なっていた。DirectX 7になって、やっとこれがハードウェア側で処理するべきものに切り替わったのである。
あとはハードウェアT&Lと専用回路で構成されていた。
GeForce 3 Ti : 頂点×1、ピクセル×4
GeForce 4 Ti : 頂点×2、ピクセル×4
GeForce FX : 頂点×3、ピクセル×4
GeForce 6000 : 頂点×6、ピクセル×16
GeForce 7000 : 頂点×8、ピクセル×24
GeForce 8000 : 統合型×128
GeForce 9000 : 統合型×128
GeForce 100 : 統合型×128
GeForce 200 : 統合型×240
GeForce 300 : 統合型×112
GeForce 400 : 統合型×480
GeForce 500 : 統合型×512
GeForce 600 : 統合型×1,536
GeForce 700 : 統合型×2,880
完全に処理の流れが規定されている = 物理的にもGPUの基盤が最適化して構成されていた
https://scrapbox.io/files/666c47b0fffe01001c12a9f8.png
実際のハードウェアの実装がこの通り、というのではなく、あくまでもソフトウェアからはこう見える、という話であることに注意されたい。
つまりイメージとしてはDicrectXがまずあり、こんな順番のレンダリングパイプラインで3Dを描画するよって流れがある
これにそのまま物理的に対応すると最も効果的なのでGPU側も載る
DirectXが新しいバージョンになるごとに更に色んなAPIとか機能が生えていくけど基本はパイプラインがあるのは不動
途中でシェーダ差し込めたりするようになったのでよりリッチな表現ができるようになったり
グラフィックス描画の最小単位はピクセルになるが,ピクセルごとのライティング計算には基本的に依存関係がないため,並列に実行できる。よって,グラフィックスレンダリングの性能を上げるためには,たくさんの演算器を搭載すればよいことになる。
GPUにおける演算器には,グラフィックス描画にある程度特化した機能が与えられたため,「陰影(shade)処理を行うユニット」という意味の「シェーダユニット」(Shader Unit)という呼び名が与えられた。
最初期のGPGPUは,汎用演算のプログラムを,グラフィックスレンダリングに見立ててGPUに実行させるアプローチを取っていた。
GPUとしては普段通りグラフィックスをレンダリングしているだけのつもりだが,フレームバッファには映像ではなく,「欲しい演算結果」が書き込まれるように仕向けたレンダリングプログラムを動かすという手法だ。GPUをある意味,無理矢理にGPGPUとして使おうとしたわけである。
これはハック手法としては面白かったが,GPGPUを万人に利用してもらうためのうまいやり方とはとても言えない。そこで次に期待されたのが,グラフィックスレンダリング以外に利用が可能なGPUアーキテクチャと,これを簡単に利用できるようにするためのプラットフォームだ。
NVIDIAは,そうした声に応える形で,新しいGPUアーキテクチャ「Tesla」(テスラ)を開発した。4Gamer読者になじみ深いGPU名でいえばGeForce 8000シリーズである。そして,Teslaアーキテクチャとほぼ同じタイミングでリリースされたGPGPUプラットフォームが,「CUDA」(Compute Unified Device Architecture,クーダ)となる。
https://scrapbox.io/files/666c4e76e5db2a001caae040.png
基本はピクセルへの色塗り
うん、固定だったんすね。埋め込まれたグラフィクス処理しかできない
初期の GPU のアーキテクチャは,Fig. 1 に示すよう
な,固定機能パイプライン処理を行うものであった.固
定機能パイプライン処理とは,前工程の処理の終了次第,
次工程の処理へ移るパイプライン処理と,各工程が Fig.
1 の中に示すような固定機能により構成されている処理
である.
---
ゲーム制作者になるための3Dグラフィックス技術に戻る
DirectXはレイトレーシングパイプラインにネイティブ対応(DirectX Raytracing) 今までのパイプラインの話でラスタライズがどこに出てくるかだが、パイプラインの中の話
https://scrapbox.io/files/666c54cd177dbe001d7c2791.png
そもそもレイトレではパイプラインの構成が大幅に異なる
https://scrapbox.io/files/666c556b27f1aa001de46292.png
負荷がデカいので今後全部置き換わるわけではないと考えられている
法線マップ
テクスチャに法線ベクトル仕込んどいたら陰影とか出せて良いのでは?
法線ベクトル格納したテクスチャを法線マップと呼ぶ