現在、シャドウ テクスチャを使用してシャドウをレンダリングするプロジェクトに取り組んでいます。
スポットライトの方向に必要なテクスチャは 1 つだけなので、スポットライトの場合は非常に簡単でしたが、すべての方向に 6 つのテクスチャまたはポイントライトの周囲のすべてのオブジェクトをレンダリングする 1 つのテクスチャが必要なため、少し難しくなります。
そして、それが私の問題です。ポイントライトの周りに 360 度の角度ですべてのオブジェクトをレンダリングする投影マトリックスを生成するにはどうすればよいですか?
基本的に、魚眼 (または他の 360 度カメラ) の頂点シェーダーを作成するにはどうすればよいですか?
1 に答える
ポイントライトの周りに 360 度の角度ですべてのオブジェクトをレンダリングする投影マトリックスを生成するにはどうすればよいですか?
できません。均一空間の 4x4 射影行列は、多角形のエッジを曲げる操作を表すことができません。直線は直線のままです。
基本的に、魚眼 (または他の 360 度カメラ) の頂点シェーダーを作成するにはどうすればよいですか?
少なくとも一般的なケースでは、それもできません。これは使用中の射影行列の制限ではなく、ラスタライザーの一般的な制限です。もちろん、魚眼歪みの式を頂点シェーダーに入れることもできます。ただし、ラスタライザーは各三角形を直線のエッジでラスタライズしますが、各三角形の角の点の位置を歪めるだけです。これは、単一のピクセルをカバーする小さな三角形に対してのみ正しいことを意味します。より大きな三角形の場合、画像を完全に台無しにします。T ジョイントのようなものがある場合、実際には完全に閉じているはずのオブジェクトに穴や重なりが生じることさえあります。
スポットライトの方向に必要なテクスチャは 1 つだけなので、スポットライトの場合は非常に簡単でしたが、すべての方向に 6 つのテクスチャまたはポイントライトの周囲のすべてのオブジェクトをレンダリングする 1 つのテクスチャが必要なため、少し難しくなります。
これに対する正しい解決策は、6 つの面を提供する単一のキューブ マップ テクスチャを使用することです。完全な立方体では、水平方向と垂直方向の両方で 90 度の視野を持つ標準的な対称透視投影によって各面をレンダリングできます。
最新の OpenGL では、レイヤード レンダリングを使用できます。その場合、キューブ マップの 6 つの面のそれぞれを 1 つのレイヤーとして FBO にアタッチし、ジオメトリ シェーダーを使用してジオメトリを 6 倍に増幅し、6 つの異なる射影行列に従って変換することができます。完全なシャドウ マップに必要なレンダー パスは 1 つだけです。
Nvidia のNV_viewport_swizzle (Maxwell および新しい GPU で利用可能)のように、キューブ マップのレンダリングをさらに最適化するために使用できるベンダー固有の拡張機能が他にもいくつかありますが、完全を期すためにこれについてのみ言及します。