Vulkan Raytracing でアプリを実装していて、 NVIDIA RTX シリーズと AMD RADEON RX シリーズとで挙動の差があることに出遭いました。そのときの様子が以下の画像です。左側が NVIDIA Geforce RTX、右側が AMD RADEON RXシリーズです。
各インスタンスIDを描画
今回は各球体を別々の VkAccelerationStructureInstanceKHR 構造体で設定しているので、 gl_InstanceID で各IDの色分けをしてみました。(とりあえず ID の1の位で色分けしています)
これを見ると、明らかに gl_InstanceID が球体の途中から切り替わっていることが分かります。
こうなった原因について
普段は NVIDIA Geforce RTX 環境を使っていて、そちらで問題が無かったので、「これは RADEON RX 6000シリーズの不具合だ」と予想しつつ調べていたのですが、実は自分のプログラムミスでした。
この球体を配置するのに適当に乱数を使って配置していたのですが、ちょうどこの位置(赤い球)で2つのオブジェクトが重なる状態となっていました。重なっているものを少しずらしたのが次の画像です。
この色を見ると先の図と同じように、緑と赤の組み合わせで合致しています。さて、どうしてこのようになったかですが、視点を移動してようやくこの状況が発覚したので、おそらくレイの衝突判定処理で、緑 or 赤のどちらの BLAS に当たったかを判定する部分で変わってくるのでしょう。 NVIDIA では、たまたま同じで変動せず、AMDの場合では状況により入れ替わってしまう、ということが理由として考えられそうです。それで、キレイに AABB 的な境目が見えてくるのでしょう、たぶん。
この件を調査するにあたり、Shocker (@Shocker_0x15) さんより助言を頂いたりしまして、本当にありがとうございました。
まとめ
挙動に差が出てくることもあるので、NVIDIA RTX で動いていたからといって全てで期待通りに動くとは限りません。NVIDIA Geforce と AMD RADEON では浮動小数点のレンダーテクスチャで演算の誤差の丸め方についても差があるのは有名ですが、今回のような部分にも差があるということで覚えておきましょう。
コメント