以下の3つの項目について調査、まとめを行いました。
- CPUとGPUに役割の違いについて
- DirectXは結局何をしてくれるのか
- CPUとGPUが扱うデータのありか
CPUとGPUはそれぞれ得意なことが違います。簡単に説明をすると以下のようなことが得意です。
- CPU : 汎用的な計算
- GPU : 単純だが大量の計算
「CPU = 画面出力以外の計算すべて」「GPU = 画面出力時の処理」と覚えておけば大丈夫です。
DirectXと聞くと、「ゲームや3DCGを使うときに使うWindowsで動くやつ」という認識だと思います。
これは、間違いではありません。
しかしもう少し詳しく説明すると、「CPUからGPU(グラフィックス処理ユニット)にデータを送り、グラフィックスやオーディオのレンダリング、計算、表示などの処理を行うための機能を提供するやつ」という認識を持っていると、これからの話しの理解が早いかと思います。
「CPUからGPUにデータを送る」という部分が肝です。
GPUが本当に単純な作業に集中できるように、CPUは、色々な数値をGPUが計算しやすいようにしてからGPUに渡して上げる必要があります。
例えば、Vector3で座標を表すときに、私達は直感的にデカルト座標系に当てはめて考えられるのでわかりやすいですが、GPU側では、Vector3だけ渡されてもすぐに使えません。GPUが本領を発揮できる行列形式にしてあげる必要があります。
CPU上の行列の形式と、GPU上の行列の形式はこれまた違うので、行列であっても変換が必要になります。
最後にデータはどこにあってどこに送るのかについて解説します。
モデルを画面に表示するまでの流れを使って順を追って解説してみます。
- モデルデータを読み込み
- 読み込んだモデルデータを一旦、「RAM(CPU側のメモリ)」に保存
- CPUでデータを表示する前処理を行う(モデルデータの解析,GPUが理解しやすいように前処理)
- 準備ができたデータを「RAM(CPU側のメモリ」から「VRAM(GPU側のメモリ)」に保存
- GPUで表示する前の処理(影をつけたり、透明部分を処理したり)
- ディスプレイに表示
細かい流れは省略していますが、大枠はこの流れでデータのやり取りがされます。
このことから、データは、CPUで処理をしているときはRAMに、GPUで処理をしているときはVRAMに有ることになります。
手順の5と6の間でGPU上で行われる、「データを読み出してたくさんの補正をかけていく処理」をレンダリングパイプラインと言います。
この処理には、シェーダーという機能が使われていて、HLSLというシェーダー専用の言語で書かれています。
この記事で解説した3つの内容は、本当に基本的なことなので、実際の開発などで使おうとするともう少し踏み込んで理解が必要になります。
しかし、ざっくりとでも理解しておくと、ゲームエンジンを使う場面などでも理解のスピードが違ってくると思います。
分かりにく部分や説明不足な部分があれば、私のツイッターかコメント欄にご連絡ください