😺

【Vision Pro】Immersive VideoにおけるFoveated Renderingによるチラつきとmipmap

に公開

OSレベルのFoveated Rendering

Vision Proでは以下セッションにある通り、Immersive ModeにするとFoveated Rendringが発動し、ユーザーの視線追跡に合わせて視線が当たっている部分を高解像度、当たっていないところを低解像度に調整する機能が働きます。これは電力などのパフォーマンスを最適化するためです。

https://developer.apple.com/videos/play/wwdc2025/294/?time=650

以下の動画を見ると分かりやすいです。

https://www.youtube.com/watch?v=rO62xZ27BPE

Compositor Servicesを使ってImmersive空間を表現する場合はisFoveationEnabledをfalseにすることで、オフにできます。しかし、Reality Kitにはこれ相当のAPIは用意されていないようです。

https://developer.apple.com/documentation/compositorservices/layerrenderer/configuration-swift.struct/isfoveationenabled

高解像度のImmersive Videoにおいて不都合な理由

この機能がImmersive Videoに不都合な理由は、例えば16Kなどの高解像度のフレームを投影した時に、視線が当たっている部分はそのままの解像度で綺麗に見えますが、当たっていない部分の16K(厳密には片目FOV90度なら4Kですがここでは詳細割愛)が低解像度に無理やり変換されてしまうことで、意図しないサンプリング結果になってしまいます。

以下の例を見てみてください。

砂浜の例え話

16Kテクスチャ = 何キロにもわたる広大で美しい砂浜だと想像してください。この砂浜には、白い砂、黒い砂、茶色い砂、貝殻などが無数に混じっています。

低解像度領域の1ピクセル = この巨大な砂浜全体を、たった1枚の写真で表現しようとしている状況です。
サンプリング = 写真を撮るために、砂浜の中からたった一粒の砂を拾い上げ、「この砂浜の色はこれです!」と宣言するようなものです。
何が起こるでしょうか?

たまたま白い砂粒を拾えば、あなたは「砂浜は真っ白だ」と結論づけます。
一歩動いて、次に黒い砂粒を拾えば、「いや、この砂浜は真っ黒だ」と結論を変えます。

ここで、元々の動画が低解像度だったらどうでしょうか?
低解像度はある意味、少ないピクセル数で映像を作るために、エンコード段階で1つ1つのピクセルの色が高解像度よりも 平均化 されています。上の例で言うと、「白と黒を足して2で割ったグレー」のピクセルが多く存在するようなものです。そのため、低解像度→低解像度サンプリングしても、元映像の意図が崩れにくいようになっています。

エイリアシング(Aliasing)

エイリアシング(Aliasing) とは、元の高解像度のデジタル信号を、それより低い解像度でサンプリングしたときに発生する、本来存在しないはずのノイズや歪みの総称です。

エイリアシングにはジャギーとチラつきの2種類の現象があり、Vision Proではチラつきがよく見られます。

チラつき

細かいテクスチャパターンや細いオブジェクトが、チカチカと点滅したり、現れたり消えたりするように見える現象です。

特に遠くにあるオブジェクトによく見られます。なぜ、遠くにあるオブジェクトで発生率が高いのでしょうか?

まずは、近くにあるオブジェクトと遠くにオブジェクトのピクセルの使われ方を見てみましょう。

近くのオブジェクト:
スクリーン上で大きく表示されます。
例えば、ただの「石」もカメラの近くにあれば1000x1000ピクセルを占有できるかもしれません。

遠くのオブジェクト:
スクリーン上で非常に小さく表示されます。
1000x1000ピクセルの中に「石」「草」「空」などのたくさんのテクスチャが入っているかもしれません。

ここでFoveated Renderingによる視線外のダウンサンプリングを考えてみましょう。

Vision Proのダウンサウンプリングでは色を平均化するのではなく、 代表的な1ピクセルを抽出 します。ここが重要なところです。

上記の例で、近くのオブジェクトなら1000x1000のどこをピックアップしても「石」の色をサンプリングできます。
しかし、遠くのオブジェクトはどうでしょうか?1000x1000の中に「石」「草」「空」が入っているので、もしかしたら「空」のピクセルが選ばれるかもしれませんし、次のフレームでは「草」のピクセルが選ばれるかもしれません。

これが90FPSの場合、1秒間に90回行われるわけです。どうでしょうか?遠くのオブジェクトはグレー(石)になったり、緑(草)になったり、青(空)になったり、、、「チラつき」そうですね。

逆に言うと、遠くのオブジェクトでも1000x1000が単色で構成されていればこのチラつきは起きず、近くのオブジェクトでも多くの色で構成されていれば、ダウンサウンプリングによる影響を受けます。

結果として遠くのオブジェクトがチラつきやすい傾向にある、と言うだけです。

mipmap

ここまで「高解像の遠くのオブジェクト」はVisionOSにおけるFoveated Renderingに影響を受けやすいと言うことをお話ししました。

では、どうすればこの現象を回避できるのでしょうか?
1つは「遠くのオブジェクトを低解像度で平均化サンプリング」すれば良いです。

-----ここから先は別途追記予定-----

Discussion