はじめに
レイトレイシングは、n次のリフレクション(反射)やディフラクション(回折)を効率的に評価するテクニックです。リスナーからランダムにキャストされたレイ(ray)を追って、リフレクションやディフラクションを続けて受けたときのパスを、確認するというのが基本的な考え方です。この技術の発想は、グラフィックレンダリング技術からきています。現在の実装はリフレクションやディフラクションを、リスナー側とエミッタ側で、4次までサポートしています。
概念
- Primary rays: リスナーから直接キャストされたレイ
- Reflection: サウンドの、面からの跳ね返り
- Diffraction: サウンドの、物体周りの回折
- Paths: リスナーからエミッタまでの、一連のリフレクションまたはディフラクション
- Emitter receptor: エミッタを中心に配置された、ボックスまたは球体の囲い
設定
- Number of Primary Rays (uNumberOfPrimaryRays): リスナーからキャストされるレイの数。Primary rayの数を増やすと結果は良くなりますが、CPU時間のコストが増えます。デフォルト値が、ほとんどの適用例に適しています。
- Maximum Reflection Order (uMaxReflectionOrder): レイが連続して面から跳ね返る、最大回数。リフレクションの次数を増やすと音響シミュレーションがより繊細になりますが、CPUパフォーマンスへの負荷が大幅に増える可能性があります。
- Direct Diffraction Path (bEnableGeometricDiffractionAndTransmission): リスナーとエミッタの間の、直接の回折のパス、つまり回折のセグメントだけで構成されたパス。Direct diffraction path計算を有効にすると、CPUコストが大幅に増えます。
- Diffraction on Reflections (bEnableDiffractionOnReflection): リフレクションのパスの最初と最後に、回折を適用します(リフレクションのセグメントだけで構成されたパス)。Diffraction on reflectionsを有効にすると、エミッタまたはリスナーが障害物の後ろに移動したときに、不意にリフレクションが消えてしまうようなシミュレーションを防げます。Direct diffraction pathと同様に、CPUコストが大幅に増えます。
- Maximum Path Length (fMaxPathLength): パスのセグメント長さの最大値。値が高いほど長いパスを計算できますが、CPUコストが増えます。
- CPU Limit Mode (bEnableCPULimitMode): 有効にすると、レイトレイシングエンジンがPrimary rayの数を自動制限し、CPU使用量がCPU Limit Percentage付近で維持されます。
- CPU Limit Percentage (fCPULimitPercentage): レイトレイシングエンジンがリフレクションやディフラクションの計算に使用するCPUの目標値(オーディオフレームに対する割合)。
CPU Limit Mode
Primary rayの妥当な数は、シーンの複雑さ(三角形やディフラクションエッジの数)やエミッタ数などによって変わるので、調整は簡単ではありません。CPU Limit Modeを有効にすれば、Primary rayの数はレイトレイシングエンジンで自動調整され、CPU使用量はユーザーが事前に定義した目標値付近で維持されます。このモードを使うと、CPU使用量の急上昇は抑えられますが、単発で急なピークを完全に排除することはできません。 目標値を高く設定すると、品質(リフレクションパスやディフラクションパスの認知数)は上がりますが、パフォーマンスは下がってしまいます。一方、目標値を低く設定すると、パフォーマンスは向上しますが品質が犠牲になります。 CPU Limit Modeを有効にすると、Primary ray数は最大500に制限されます。Primary ray数が0まで下がると、レイトレイシングエンジンは、環境のスキャンを停止します。ただし、すでにある音の伝播パスは、引き続き検証され更新されます。その結果、レイトレイシングエンジンによるCPUの消費は続きます。 なお、CPU Limit Modeはポータルのレイトレーシングに影響しません。
制限
レイトレイシングエンジンのためにジオメトリを定義する際に、考慮すべき制限事項がいくつかあります。パフォーマンスと結果の質の両方に関する制限事項です。
ジオメトリの見える角度
三角形がサンプリング密度よりも小さいと、それをレイトレイシングエンジンが見つけづらくなります。
ジオメトリの見える角度α(アルファ)とは、リスナー視点からジオメトリが見える角度のことです。Primary rayの数によって、2つのレイの間の平均的な角度 γ(ガンマ)は異なります。αとγの相対関係によって、オブジェクトとの交点(リフレクションまたはディフラクション)が見つかる確率が変わります。γがαより小さければ、交点が見つかる確率が上がります。γがαより大きければ、交点が見つかる確率が下がります。
この例ではγの方がαより小さいです。よって、オブジェクトとの交点が見つかる確率は高くなります。
この例ではαの方がγより小さいです。よって、オブジェクトとの交点が見つかる確率は低くなります。
三角形の個数
ジオメトリ内の三角形の数が、エンジンのCPU消費量と直接関係し、三角形が増えれば、それだけCPUの消費量が増えます。これは、オブジェクトに必要となる交点テストが増えるからです。一般的に音の伝播に高度なジオメトリは必要ありません。そこで三角形の数を減らせば、品質を犠牲にすることなくパフォーマンスを向上できます。
この平面は、4つの三角形から構成されているので、レイのテストを、それぞれの三角形に対して行います。
ジオメトリの形状
ジオメトリ形状は、処理しやすいものと、しにくいものがあります。一般的に、平面やボックスなどは簡単に処理でき、音の伝播の観点では一番良い結果を出します。球体や円柱は、エラーが発生しやすくなります。球体や円柱には曲面が伴うからです。場合によって、見落とされる回折エッジが出てしまい、そうすると一部の回折パスが抜けてしまいます。アルゴリズムにヒューリスティックをいくつか導入しているので、多くのケースでこの問題に対処できます。Primary rayの数を増やしたり、ジオメトリを簡略化したりすることでも、この問題を解消できます。
このような状況では、LからEへと向かう回折パスは、途中でL、E2、E3、E4、Eを通過すると予想されます。ところが、E1とE2の間の面が狭いので、回折エッジE2を出すために必要な交点が見つけづらくなっています。この場合は、E1が見つかる確率の方が高くなります。Lは、E1のシャドーゾーンに入っていないので、アルゴリズムは、E2からの回折パスを実際に見つけることができません。
パフォーマンスの改善
Performance Monitorに、スペーシャルオーディオのCPU使用に関する多数のカウンターを表示するように設定できます。詳細は Performance Monitor Settings を参照してください。プロファイリング中のこれらのカウンター値を基に、下表の情報を使ってスペーシャルオーディオのパフォーマンスを改善できます。
| 症状 |
可能な解決策 |
| すべてのスペーシャルオーディオ関連のカウンターが高い |
-
反射(リフレクション)の次数を減らします: 多くの場合、1次や2次の反射で充分です。 li>回折や回折の反射を不要であれば無効にします: 回折の計算はCPUに負荷がかかります。<分節 25607>bEnableGeometricDiffractionAndTransmissionとbEnableDiffractionOnReflectionの両方または一方をオフにします。
-
シーン内のエッジ数を減らします:ディテールの凝ったオブジェクトはCPU負荷が大きくなり、全体の品質を下げてしまう傾向があります。
-
ルームやポータルを使います: あるシーンが独立した複数のセクションで構成されている場合は、ルームやポータルを利用して分離することを検討してください。
-
モーションの閾値を上げます: 値が低いと、ジオメトリの大きさによっては環境を確認する頻度が多すぎる可能性があります。質の良い結果を保てる範囲で、最も高い値に設定することを検討してください。
-
可能であれば三角の数を減らします: ディテールの凝ったオブジェクトはCPU負荷が大きくなり、全体の品質を下げてしまう傾向があります。
|
| Spatial Audio - レイトレーシングCPUが高い |
-
Primary rayの数を減らします: 値を20まで下げても質の良い結果が得られます。
-
CPUリミット( CPU Limit Mode )を有効にします: CPU率()を希望値に設定すれば、CPUが指定値付近で維持されるように、Primary rayの数が自動的に制御されます。なお、これはポータルのレイトレーシングに影響しません。
-
モーション閾値を上げます: 低い値では環境を確認する頻度が多すぎて平均的なCPUパフォーマンスが下がりますが、ピークへの顕著な影響がありません。
|
| Spatial Audio - Path Validation CPUが高い |
-
回折や回折の反射を不要であれば無効にします: 回折の計算はCPUに負荷がかかります。bEnableGeometricDiffractionAndTransmissionとbEnableDiffractionOnReflectionの両方または一方をオフにします。
-
シーン内のエッジ数を減らします: ディテールの凝ったオブジェクトはCPU負荷が大きくなり、全体の品質を下げてしまう傾向があります。
|
| patial Audio - CPUが高い(パスのバリデーションとレイトレーシングの両方が関与) |
-
モーションの閾値を上げます: この場合、モーション閾値を上げることで、ピークの減少よりも平均的なCPU消費が減ります。
|