プログラミング
角はそんな風に見えない:スクリーン空間アンビエントオクルージョンについて
Corners Don't Look Like That: Regarding Screenspace Ambient Occlusion (nothings.org)
要約
この記事は、ゲーム開発で広く使われているスクリーン空間アンビエントオクルージョン(SSAO)という技術が、現実世界の光の挙動を正確に再現できていないと指摘しています。著者は、SSAOが角を不自然に暗くしたり、奇妙なアーティファクトを生じさせたりする原因を、近似誤差やライティングへの誤った適用、チューニングミスなど4つの要因に帰結させています。実際の写真データと比較しながら、SSAOが現実の視覚体験から乖離していることを示し、その改善の必要性を訴えています。
全文翻訳
角はそんな風に見えない:スクリーン空間アンビエントオクルージョンについて
Sean Barrett 2012-12-13
実際の、物理的なコーネルボックス。Goralらによる「Modeling the Interaction of Light Between Diffuse Surfaces」(1984年)より。
どうぞ、ご自身でより良いデータを集めて、私を間違っていると証明してください。もしそうできれば、私はそれにリンクします!
ゲーム開発者はスクリーン空間アンビエントオクルージョン(SSAO)に夢中です。彼らはそれに夢中すぎて、あらゆる種類のクレイジーなことをしています。アマチュア開発者は、凸角が角の近くで明るくなるスクリーンショットを投稿します。プロの開発者は、奇妙なハロや醜いアーティファクト(手すりの後ろの床を見てください)を持つゲームをリリースします。それらの欠点を回避できたとしても、SSAOを備えたゲームはしばしば間違って見えます。そして、そこから簡単に引き出せるものがあります:部屋の角が奇妙に暗く見えることです。私は、人々が部屋の角は実際には暗いと考えており、この信念によって非現実的な結果を生むコードを書くことを許してしまったからだと信じています。より具体的には、これらのケースでのSSAOの失敗は、4つの要因の組み合わせに起因すると考えています。
SSAOではなくAOを使用することによる近似誤差
RadiosityではなくAOを使用することによる近似誤差
SSAOの減光をアンビエントライティングだけでなく、すべてのライティングに適用することによるエラー
AO効果のヒューリスティックな重み付けが強すぎるチューニングエラー
私はアクティブなグラフィックス研究者ではないので、フレームワークをセットアップしてこれらのことがどこで間違ったのかを示すつもりはありません。それはSSAOの論文を発表し、ゲームにSSAOを搭載している人々の仕事です。同じ理由で、以下の議論は最も科学的でも、全く徹底的でもありません。おそらく、より多くのデータを収集すれば、私が間違っていることが示唆されるかもしれません。しかし、私の個人的な視覚体験は、人々がレンダリングしているものと一致しないため、その経験を共有したいと思いました。そのために、データを収集しました。
角はそんな風に見えない(ほとんどの場合)
以下はすべてレンダリングではなく、写真です。写真はCanon 5D Mk IIを使用して撮影され、JPEGとしてエクスポートされ、露出時間は1/80秒から1/8秒の範囲でした。元の大きなJPEGは、Adobe Photoshopを使用して各次元で約4分の1にダウンサンプリングされました。すべての画像は、クロマノイズアーティファクトを軽減するために、ダウンサンプリング前にPhotoshopで16幅のガウシアンを使用してクロマチャンネルをぼかしました。アパートの天井は壁よりも明るく白い色なので、それを照明のせいにしないでください。まず、一般的なAO/SSAOレンダリングのように見える写真から始めましょう。
劇的に暗くなった角(この画像は効果をより目立たせるためにデジタル的に明るくされています。希望としては、明るさの調整はガンマを維持しているはずです。)
典型的なSSAOレンダリング画像のように見える角を、私の部屋でかなり探す必要がありました。問題は、実際にはそうではないということです。壁(c)は光を見ることができませんが、壁(d)はそれにかなり露出しています。壁(d)の左端の暗さは、主にAO(つまり、相互反射/Radiosity効果)によるものではありません。それは主に、画面の左上から少し外れた場所にある光源からのソフトシャドウによるものです。左側の角、壁(b)と壁(c)の間は影を落としていますが、光源に非常に近いため、大きなソフトシャドウに広がっています。しかし、他にも暗くなっているエッジがあります。それらはどうでしょうか?壁(d)の上端は別の影です――明るい壁の上端を見てください。光源は奥まっており、ここにあるすべての光は実際には奥まった場所からの反射光であり、その奥まった場所の縁が壁の最も上の部分にその光が当たらないようにしています。(天井に当たるすべての光は間接光であり、部屋の壁や床、その他の物体からのものです。)壁(c)の右端に近づくにつれて、または壁(d)に沿って端に近づく天井(a)のエッジに向かう効果はどうでしょうか?それは主にランバートのドット積によって引き起こされる間接照明効果のように見えます。壁(c)の中心のエッジに近づくにつれて、壁(d)の明るい部分がますますエッジオンになり、その点は暗くなります。これはAOが捉えるべき主なものだと思いますが、ここでは誇張されています。もし壁(d)が(ソフトシャドウなしで)より均一に照らされていたら、左からエッジに近づくにつれても、視界の大部分は明るい表面で満たされるでしょう。ソフトシャドウが壁(d)を完璧な方法で暗くしているからこそ、この効果は顕著なのです。まだ1つのエッジが残っています。壁(c)と天井(a)の間のエッジです。このエッジも、どちらかの側からエッジに近づくにつれて暗くなるのが見られますが、ソフトシャドウの影響を受けるべきではありません。問題は、それが実際にどれだけ暗くなっているのか、そして他のすべての照明効果とのコントラストによる心理的な効果がどれだけあるのかということです。
カメラは知覚的ではないかもしれませんが、少なくともグラフ化することはできます
理想的には、これらの写真は既知の色空間にあるはずです。写真はsRGBにあると主張されていますが、結果を考えると、数値を取り、sRGBカーブを通して線形光の値(またはクランプされた値)に戻すことができるとは思いません。もっと複雑なトーンマッピングが行われていると思います。したがって、これらの写真が現実をどの程度反映しているかはわかりません。しかし、少なくとも写真の数値が実際にどれだけ暗くなっているのか、そしてそれが知覚的な効果であるのかどうかを理解することはできます。エッジを横切る線上のピクセルをサンプリングしてグラフ化すると、次のようになります。
上記のグラフを生成したコードは付録Aにあります。これはピクセル値(実際には3チャンネルすべてで5x5ボックスフィルターで平均化されたもの)のグラフであり、線形光の値ではなく、sRGBの明るさ(またはそれが何であれ、ここではsRGBと呼びます)のグラフです。すべてのグラフは0ベースなので、明るさの値の比率は、ベースラインからの高さの比率で判断できます。(比率を2乗すると、おおよその線形光の比率が得られます。これはすでに私が自分で取り組むべきよりもはるかに多くの作業なので、線形光のグラフを作成することは遠慮します。)左側では、エッジに近づくにつれて照明がより速く暗くなるのがわかりますが、右側ははるかに線形な上昇を示しています(おそらくソフトシャドウを横切っているため)。エッジのすぐ下にも非常に顕著なディップがありますが、これが何によるものかは不明です。(照明効果ではないかもしれません。角が汚れているのかもしれません。)
(a)と(d)のエッジも同様に見えます。しかし、(a)と(c)のエッジを見てみましょう。これは理論的にはそれほど誇張されておらず、「実際のAO」効果に似ており、最も間接的な照明があります。ここでのグラフは下から上です。ここでもエッジに向かって明確な暗化が見られますが、その効果の大きさは大幅に減少しています。中央には下向きのディップはありません。
グラフを比較する際には注意が必要です。理想的には、線分は2つに分割され、各半分はワールド空間でエッジに垂直であり、短縮を考慮する必要があります。代わりに、短縮が異なる可能性のある単一の線を使用しており、グラフはカバーされているピクセル数に応じて自動スケーリングされますが、これは常に一貫しているとは限りません。特に、上の2番目の線は最初の線よりも垂直ではないように見えますが、それがどれほど影響するかはわかりません。ちなみに、スケールを理解するために:壁(c)は幅13.5インチです。したがって、その上の緑の線分(