2016-07-03 9 views
0

私は現在、シャドウを描画するためにシャドウテクスチャを使用するプロジェクトに取り組んでいます。
スポットライトの方向に1つのテクスチャしか必要ないので、スポットライトの方がかなり簡単ですが、すべての方向に6つのテクスチャが必要であるか、またはポイントライトの周囲にすべてのオブジェクトをレンダリングする1つのテクスチャが必要です。
それは私の問題がどこですか。どのようにして360度の角度でポイントライトのすべてのオブジェクトをレンダリングするProjection matrixを生成することができますか?
基本的に魚眼(または他の360度カメラ)頂点シェーダーを作成するにはどうすればよいですか?ポイントライトシャドーマップに使用できる投影行列を取得するにはどうすればよいですか?

答えて

0

どのようにして360度の角度でポイントライトのすべてのオブジェクトをレンダリングすることができますか?

できません。均質空間内の4×4投影行列は、ポリゴンのエッジを曲げる結果となる操作を表すことはできません。直線は直線のままです。

基本的に魚眼(または他の360度カメラ)頂点シェーダーを作成するにはどうすればよいですか?

少なくとも一般的なケースでは、これを行うことはできません。これは、使用する投影行列の制限ではなく、ラスタライザの一般的な制限です。もちろん、魚眼レンズの歪みの式を頂点シェーダーに入力することもできます。しかし、ラスタライザは直線エッジで各三角形をラスタライズしますが、各三角形の角点の位置を歪ませるだけです。これは、単一ピクセルをカバーする小さな三角形に対してのみ正しいことを意味します。大きな三角形の場合、イメージを完全にねじれます。 Tジョイントのようなものがあれば、実際に完全に閉じなければならないオブジェクトに穴や重なりが生じます。

、それはすべての方向に6つのテクスチャや何らかの形ですべてのobectsをレンダリングする1つのテクスチャのいずれかを必要とするので、それはスポットライトの方向にのみ1テクスチャが必要とされているので、スポットライトのためにかなり簡単だったが、その少し難しくポイントライトの周り。

この解決策は、6つの面を備えた単一のキューブマップテクスチャを使用することです。完璧な立方体では、それぞれの面は、水平および垂直の両方向に90度の視野を持つ標準対称透視投影によってレンダリングできます。

最新のOpenGLでは、layered renderingを使用できます。その場合、キューブマップの6つの面のそれぞれをFBOに1つのレイヤーとしてアタッチし、ジオメトリシェーダを使用してジオメトリを6倍に増幅し、6つの異なる投影行列に従って変換します。完全なシャドーマップのレンダーパスは1つだけ必要です。

NvidiaのNV_viewport_swizzle(Maxwellと新しいGPUで利用可能)のように、キューブマップのレンダリングをさらに最適化するために使用されるベンダー固有の拡張機能がいくつかありますが、これについては完全な説明が必要です。

+0

ありがとう、私はデュアルparabloidレンダリングを見てきましたが、おそらくキューブマップで終わるでしょう。ありがとう – user2741831

関連する問題