私は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);
これは特に大きなポリゴンで、遠近問題につながる:
それは私には意味があります。球形でなければならないときは線形補間をしています。しかし、Posにnointerpolation、centroid、および/またはnoperspectiveを使用しても明らかな効果はありません。
この異常な予測で適切な視点を得る方法はありますか?私はこれについて完全に間違った方法をとっていますか?
私は後処理が可能です。 UV座標をバッファに書き込んだ後、それを修正しますか?どのような訂正が適切であるかご存じですか?あなたのコメントで混乱しています:FOV--これは180度の視覚化です。非常に広いFOVで従来の変換を使用する場合、後処理の補正は不要ですか? – user2206636
気にしないでください。私はあなたが言っていることを見ていると思う。超高解像度で広角にレンダリングし、次にダウンサンプルし、魚眼を得るためにエッジを犠牲にして中心を拡張します。私はむしろ180度のスフィアマップを作成したいと思いますが、環境マッピングにはそれほど優れているわけではありませんし、160のようなものはおそらく耐えられるでしょう。ありがとう、私はそれを試みます。 – user2206636
@ user2206636右主な問題は、球面投影が非線形であることです。レンダリングパイプラインを制御できるなら、キューブマップの面に直交する角度で異なる投影で複数回レンダリングする方がよいでしょう。 – MooseBoys