ここまで3つの改良ポイントは、レイのトラバースやインターセクション処理を高効率化するための取り組みだった。4つ目のポイントは、そことは少し異なる観点からの改良だ。
レイトレーシング処理では、ピクセルから放たれたレイがポリゴンなどに衝突して交差判定が確定すると、その箇所に対して「ライティング」や「シェーディング」の演算を行う必要がある。レイが光源に到達した場合は、発射元のピクセルでも同様の処理が行われる。
ライティングやシェーディングに関する演算はRTコアではなく、プログラマブルシェーダーとしての機能を担うCUDAコアで行われる……のだが、問題はレイトレーシング法と、従来的な「ラスタライズ法」では、CUDAコアの使われ方が全く異なるという点にある。
ラスタライズ法では、ポリゴンがラスタライザーによって、一塊の複数ピクセルに分解される。そして、分解された塊たちが“ドバっと”プログラマブルシェーダーに押し込まれる。ラスタライザーによって分解/生成された「一塊の複数ピクセル」は、元々は1枚のポリゴンから誕生したものだから、ほぼ同一の材質のことが多い。
ゆえに、CUDAコアが実行することになるライティングやシェーディングのシェーダープログラムは同一のもので、ほぼ同じテクスチャーを参照することになる。となれば、大増量されたL2キャッシュの利用効率もすこぶるよい。
しかし、レイトレーシング法の場合、隣接する“近しい”ピクセル群から発射されたレイたちも、それぞれの発射角度が異なれば、異なる3Dモデルのポリゴンに衝突する可能性もある。放たれたレイたちが衝突先のポリゴンで“反射”する場合も、それぞれ全く異なる場所にある3Dモデルのポリゴンに当たることも多くなるだろう。
すると、各レイがライティングやシェーディングのためにCUDAコアに外注するシェーダープログラムはバラバラなものになる。当然、L2キャッシュの利用効率も悪くなる。場合によっては、別の仕事で忙しいCUDAコアが受注に応じられない可能性も否定できない。
CUDAコアを含めて、近代GPUのプログラマブルシェーダー類は、SIMD(Single Instruction Multiple Data:1命令で複数データを取り扱うモデル)から発展した実行モデル「SIMT(Single Instruction Multiple Threads:1命令で複数スレッドを取り扱うモデル)」を採用している。ゆえに、一番パフォーマンスを高められるのは「同一のシェーダープログラムを、ひとまとめにされた複数スレッド(ピクセル)に対して実行したとき」となる。この実行モデルは、ラスタライズ法での活用を想定して作られたものなので、どうしてもレイトレーシング法のレンダリングメカニズムとは相性がよくない。
レイトレーシング法でも、プログラマブルシェーダー(NVIDIAならCUDAコア)におけるシェーダープログラムの実行効率を向上できないか――そこでNVIDIAが仕込んだ新しい概念が「Shader Execution Reordering(SER)」だ。
SERは、衝突したとみなされたレイがプログラマブルシェーダーに仕事を発注する際に、「同一のシェーダープログラムで実行できそうな発注」を整理して、可能な限りまとめてから発注する役割を持つ。いわば「交通整理人」のような役割といえる。
これにより、「同じシェーダープログラムが別のCUDAコアで動く」という非効率な状況を抑えることができる。逆にいえば、同じCUDAコアで局所性の高いスレッド(例えば同じ材質の処理)を複数扱えるようになるので、L3キャッシュの利用効率の向上も期待できる。
NVIDIAは、SERについて「レイトレーシングパイプラインに、新しいステージを追加したもの」と説明している。確かにその通りだ。CPUの命令実行モデルの変革と同様に、従来の「逐次実行」のスタイルから、「順不同(Out-of-Order)実行」スタイルにシフトしたともいえる。
SERの実行イメージ。図の左側は、全てのレイが高い局所性を持って3Dシーン内のポリゴンと衝突したときの“ベストケース”で、衝突したレイに対するライティングとシェーディングの処理は、まとめてプログラマブルシェーダー(CUDAコア)に発注される。図の右側は、全てのレイが方々に反射してしまい、3Dシーン内のポリゴンに対して高いランダム性を持って衝突したときのケースだ。こんな場合でも、SERを使うことで、“近似の”ライティング/シェーディング処理を整理し、まとめてプログラマブルシェーダーに発注できるただし、このSERも既存のレイトレーシング対応ゲームで自動活用できる類いのものではない。ゲーム側が制御APIを通じてSERに対応させなければ、SERの恩恵を受けられないのだ。
このことは、当然といえば当然でもある。ゲームのグラフィックスエンジン(グラフィックサブシステム)は、「どの3Dモデルのどのポリゴンには、どんな材質設定がなされていて、どのテクスチャを使うのか」といったことは把握している。ゆえに、衝突が検知された各レイが、これからプログラマブルシェーダーへ発注することになる処理内容にも見当が付く。
どのゲームにも自動対応する(≒アプリとしての特別対応を不要とする)よりも、グラフィックスエンジンで効果的なSERメカニズムを実践する(≒アプリで特別な対応を施してもらう)方が、仕組みを最大限に生かせるのだ。
ちなみに、NVIDIAは開発者向けにGPUパフォーマンスの解析ツール「NSight Graphics」を用意している。SERの利用に当たっては、このツールを使って解析してから実装することが推奨されている。
SERについては、先の改善と同様に現時点ではDirectX Raytracingを介して利用することができない。NVIDIAは他のグラフイックス関連企業と連携して、標準対応に向けた協議を進めているという。
その実際の効果だが、NVIDIA調べで「Cyberpunk 2077」の最上位設定「Overdrive Tracing」においてSERを有効化すると最大44%のパフォーマンス向上効果があるとのことだ。
このように、GeForce RTX 40シリーズのレイトレーシング機能は、我々が想像していた以上にパワーアップしている。
しかし、ここまでの解説を見てきて「あれ?」と思った人もいるだろう。そう、GeForce RTX 40シリーズならではのレイトレーシング機能を使うには、ゲーム(アプリ)側で個別対応が必要なのだ。
現状では、NVIDIAから提供されているSDKを活用するか、NVIDIAが提供する「Unreal Engine 5」のスペシャルバージョンを使うことで、これらの機能を活用したゲームを開発できる……のだが、開発者にここまでの“特別対応”をするためのリソースがあるかというと、そこまででもないように思える。
PCゲーミング向けGPUの世界では、確かにGeForce RTXシリーズはリーダー的な存在だ。しかし、実際に今回紹介した新機能を“効果的に”実装しているゲームは、NVIDIAが開発協力したタイトル(例えば「Cyberpunk 2077」)以外にほとんど存在しない。
ただし、GeForce RTX 40シリーズに搭載された新機能は、DirectX Raytracingの新バージョンで標準利用できるようになる可能性が高い。AMDのRadeonシリーズでも対応を果たせば、より多くのゲームタイトルで積極的に使われるようになるだろう。
次回は、AMDの「Radeon RX 7000シリーズ」におけるレイトレーシング機能の改善ポイントをチェックしていきたい。
GPUの「レイトレーシング処理」改良の歴史をひもとく【GeForce RTX 30シリーズ編】
2035年、ゲームグラフィックスは「オール・パストレーシング時代」へ――レイトレーシング技術の“先”を見つめる
「レイトレーシング」の最大の“敵”とは何か? やっつける方法はあるのか?
ゲームの中で「レイトレーシング」はどう使われる? 実例を見てみよう
最近よく聞く「レイトレーシング」 一体ナニモノ?Copyright © ITmedia, Inc. All Rights Reserved.