先週東京で初雪が観測されましたが、
昨晩は積もるほどの雪が降りました

そのおかげで今朝は雪化粧


今は雪はすっかり止んでいますが、まだ路面は凍結しているところが多いので、
夜になって視界が悪くなり、気付かずに滑って転んだりしないように注意が必要そうです

さて、ゲーム機のCPUのスペックが上がるのと同様に、GPUの性能もどんどん上がってきていますが、
それでもゲームで表現したいグラフィックスに性能が及ばず、GPUの処理をオーバーしてしまう場合が多々あります

そこで今回はGPUへの処理負荷軽減の基本的なテクニックを紹介しようと思います

紹介するテクニックを実行しても、必ずGPUへの処理負荷が軽減されるとは限りません。予めご了承ください。


早速身も蓋もありませんが、プログラムを書かなければバグは発生しないと同様に、
何も描画しなければGPUへの負荷はほぼ0となります

もちろんゲーム中に何も描画されなければゲームをプレイすることが出来なくなってしまうため、
必要最低限なものだけ描画するというのを念頭に置くのが大切です


前述したように、ゲームの中で必要最低限なものだけ描画するのが大事なので、
カメラに写らないもののは描画の処理そのものをキャンセルするようにしましょう。
これは視錐台カリングを行うことで、大部分が解決するのではないでしょうか


機能がONになっているだけでGPUへの負荷が大きくなってしまう描画設定がいくつか存在します。
特にアルファブレンドなどはピクセルシェーダーに大きく負荷をかけるので、
うっかり不透明描画を行っているのにアルファブレンドがONになっていたということがないように注意しましょう。
この場合、描画結果は思った通りになっているのにGPUの負荷だけ高いので気付きにくい場合が多いです

しかし、頻繁に描画設定の切り替えを行うと、動作させるゲームのプラットフォームによっては
かえって処理負荷が高くなることもあります

それを防ぐため、描画前に使うマテリアルごとにソートしておく仕組みや、描画設定のキャッシュ化がされていると尚いいのではないでしょうか


ピクセルシェーダーとは、名前にピクセルと付いているように、描画するポリゴンの1ピクセルごとに動作するシェーダーです。
そのため、描画するピクセルシェーダーのプログラムが遅く、さらにその描画するピクセル数が多ければ多いほどGPUへの負荷は大きくなります。
そのピクセルシェーダーを最低限動作させるのに簡単な方法として、Zテストを利用する方法が挙げられます

例えば下の画像ではグリとブランが草原の上に立っていますが、画面の多くをブランが占めています。
このブランの後ろには草原が広がっていますが、その草原はブランに隠れて見えないため、
ピクセルシェーダーが動作したとしても無駄ということになります


このような場合、草原を描画するピクセルシェーダーを動作させないためには、
草原より先にブランを描画してしまうのが最も簡単です。
ピクセルシェーダーが動作する条件として、描画しようとするピクセルの奥行き情報を比較し、
手前であると判断されたらピクセルシェーダーが動きます。
そのため、ブランを先に描画してしまえば隠れている草原のピクセルシェーダーは動作しなくなります。
(ただし、Z比較がONになっている場合に限ります)
つまり、カメラから見て手前にあるものから先に描画すると、無駄なピクセルシェーダーの動作を抑えられる場合が多いということになります。

いかがでしたでしょうか?
GPUの性能が上がり、それにつれて求められるグラフィックス表現の幅も広がっています

しかし、その分GPUにかかる負荷も大きくなり続けています。
そのことを踏まえた上で、出来るだけGPUに処理負荷をかけないプログラムをあらかじめ書いておくと、
就職活動用の作品の制作終盤で処理落ちに苦しむことが少なくなるのではないかと思います


それではまた
