6

私はOpenGLが初めてです。私はJOGLを使用しています。

雲や星でテクスチャリングできる世界の空を作成したいと思います。これを行う最善の方法が何であるかはわかりません。私の最初の本能は、2 次方向の非常に大きな球体を作成しGLU_INSIDE、それをテクスチャリングすることです。より良い方法はありますか?

4

3 に答える 3

11

スカイボックスはかなり良い方法です。これにはキューブ マップを使用します。基本的に、カメラの周りに立方体をレンダリングし、立方体の各面の内側にテクスチャをマップします。OpenGL はこれを固定関数パイプラインに含めることができると思いますが、シェーダー アプローチを採用している場合 (固定関数は非推奨です)、キューブ マップ サンプラー (Cg の samplerCUBE、GLSL については不明) を使用することをお勧めします。キューブ マップを描画するときは、モデルビュー マトリックスから平行移動も削除しますが、回転は維持します (これにより、スカイボックスがカメラに「追従」しますが、空のさまざまな部分を見回すことができます)。

最善の方法は、すべての不透明なオブジェクトを描画した後で実際にキューブ マップを描画することです。デフォルトでは空が他のオブジェクトをブロックするため、これは奇妙に思えるかもしれませんが、(シェーダーを使用している場合) 次のトリックを使用してこれを回避します: 頂点シェーダーで最終出力位置を書き込むときは、.xyzw を書き出す代わりに、.xyww を書きます。 . これにより、空が遠くの平面に強制され、すべての背後に配置されます。これの利点は、オーバードローがまったくないことです!

于 2010-09-24T23:56:10.207 に答える
5

はい。

本当に大きな球体を作るには、2 つの大きな問題があります。まず、クリッピングで問題が発生する可能性があります。空がファー クリッピング距離の外にある場合、空が消えることがあります。さらに、遠くからスカイ ボックスに入るオブジェクトは、非常に頑丈な壁を視覚的に通過します。第 2 に、非常に単純な効果のために多くのポリゴン (および多くの苦痛) を無駄にしています。

ほとんどの人は、実際には小さな立方体を使用します (そのため、「スカイ ボックス」という名前が付けられました)。深度テストをオフにして、プレパスで立方体をレンダリングする必要があります。したがって、実際の距離に関係なく、すべてのオブジェクトが立方体の上にレンダリングされます。辺の長さがニア クリッピング距離の 2 倍よりも大きいことを確認するだけで問題ありません。

于 2010-09-24T21:03:32.447 に答える