0

この質問は実際にはUnity3Dに関するものですが、より一般的な質問になることもあるため、この質問を可能な限り一般的にします。

のシーンがありcamera (near = 0.3, far = 1000, fov = 60)、半径10000単位のスカイドームを描画したいとします。

私はドームの中にいるので、オブジェクトはカメラの錐台によってカリングされません。しかし、頂点は何らかのシェーダーによってカリングされ、最終結果は次のようになります。

私のクリップされたスカイドーム

今私の質問は:

オブジェクト全体が描画され、カメラの遠方平面によってクリップされないようにするために、エンジンのどの設定を変更できますか?

私が望まないのは:

  • 錐台の精度が低下するため、遠方平面を10000に変更します
  • 私のゲームは実際には非常に小規模なので、ニアプレーンを変更します
  • この設定は非常にリアルに見えるため、ドームのスケールを変更します
4

2 に答える 2

1

Unity でこれを行う方法はわかりませんが、DirectX と OpenGL では zbuffer (チェックと書き込みの両方) をオフにして、最初にスカイボックスを描画します。

次に、zbuffer をオンにして、残りのシーンを描画します。

私の推測では、Unity がこれらすべてを実行できると思います。

于 2011-06-30T19:17:42.343 に答える
0

私自身の問題には2つの解決策があります。最初のものはすべてを解決しません。2 つ目はそうですが、私自身の設計原則に反しています。

使用されているシェーダーはサードパーティであるため、@ Erno からの優れたソリューションであるシェーダーの z 書き込みを変更する可能性はありませんでした。

オプション1

オブジェクトがレンダリングされる直前にファー プレーンを 100,000 に設定し、空を描画した後で 1000 に戻します。

問題: 深度バッファがまだ非常に低い値から 100,000 の間の値で満たされています。これにより、深度バッファの精度が低下し、深度バッファに依存する Z ファイティングとポスト エフェクトで問題が発生します。

オプション 2

相互にリンクされた 2 つのカメラを作成します。カメラ 1 は、最初に の設定でスカイドームをレンダリングしますfar = 100000, near = 100。カメラ 2 は深度バッファをクリアし、残りのシーンを の設定で描画しますfar = 1000, near = 0.3。現在、深度バッファーには大きな値が含まれていないため、不正確な深度バッファーの問題が解決されます。

問題: カメラ クラスには変更イベントがないため (FoV の変更時など)、カメラを何らかのポーリング システムでリンクする必要があります。カメラが 1 つしかないという事実は気に入っていますが、これは簡単にはできないようです。

于 2011-06-30T19:41:21.663 に答える