2016-08-22 16 views
1

私はMikuMikuDanceをエンジンとして使ってHLSLでいくつかのシェーダプログラミングを学んでいます。主レンダラのコードにアクセスすることはできません。DX9ではシェーダモデル3に限定されています。私は、環境を球体マップにレンダリングするシェーダを作成しようとしています。これは、一部の人にとって便利であり、実験や学習のツールとしても役に立ちます。私の素朴なアプローチは補間問題につながるようです。さらに、いくつかの頂点が不適切にクリップされ、その境界でポリゴンが描画されないようになっているようです。HLSLで補間エラーのない球面図にレンダリングする方法は?

は、私が作成するために、頂点シェーダで逆に球のマップコードを実行するだけでしようと思った私のレンダリング:

Pos = mul(Pos, WorldMatrix); 
Out.Eye = CameraPosition - Pos.xyz; 
Pos = mul(Pos, ViewMatrix); 
float far = 300000; 
float3 En = normalize(Pos.xyz); 
Out.Pos = float4(En.x, En.y, length(Out.Eye)/(far), 1); 

これは特に大きなポリゴンで、遠近問題につながる:

sphere interpolation

それは私には意味があります。球形でなければならないときは線形補間をしています。しかし、Posにnointerpolation、centroid、および/またはnoperspectiveを使用しても明らかな効果はありません。

この異常な予測で適切な視点を得る方法はありますか?私はこれについて完全に間違った方法をとっていますか?

答えて

2

レンダリングパイプラインを変更せずに真の球面変換を適用する実際的な方法はありません。これは補間問題ではなく、むしろラスタライズと頂点変換の問題です。あなたが気づいたように、キーは、球面投影は本質的に直線が湾曲することを必要とすることです。パイプラインがすでに何らかの種類のテッセレーションを利用していれば可能かもしれませんが、変形する頂点だけではそれらの間の直線エッジを決して湾曲させることはできません。

スクリーンスペースエフェクト(たとえば後処理)を変更または追加することができる場合は、ソーステクスチャ座標を操作して代わりに球面変換を適用することができます。この場合、頂点シェーダを修正してFOVを増やすと、より多くの半球を埋めることができます。これは、FOVと解像度のトレードオフですが、180度に近づくにつれて、投影前後の解像度の差が大きくなります。 179度では、初期レンダリングのほぼすべてのピクセルが半球の外側の環にマッピングされます。

+0

私は後処理が可能です。 UV座標をバッファに書き込んだ後、それを修正しますか?どのような訂正が適切であるかご存じですか?あなたのコメントで混乱しています:FOV--これは180度の視覚化です。非常に広いFOVで従来の変換を使用する場合、後処理の補正は不要ですか? – user2206636

+1

気にしないでください。私はあなたが言っていることを見ていると思う。超高解像度で広角にレンダリングし、次にダウンサンプルし、魚眼を得るためにエッジを犠牲にして中心を拡張します。私はむしろ180度のスフィアマップを作成したいと思いますが、環境マッピングにはそれほど優れているわけではありませんし、160のようなものはおそらく耐えられるでしょう。ありがとう、私はそれを試みます。 – user2206636

+0

@ user2206636右主な問題は、球面投影が非線形であることです。レンダリングパイプラインを制御できるなら、キューブマップの面に直交する角度で異なる投影で複数回レンダリングする方がよいでしょう。 – MooseBoys

関連する問題