アニメ見てたら、画面がゆがんでたんで作ってみました。
今回のプログラムは、次のものです。
まぁ、いつものように適当にファイルが入っています。 大事な部分だけを抜粋すると、次のファイルだけに注目すればいいことになります。
main.cpp | メイン関数 |
main.fx | シェーダプログラム |
他にも、実行ファイル、リソースファイル、プロジェクトファイルが入っています。
昔は頂点シェーダで描画位置を動かしていましたが、ポリゴンの角が目立つのでフィルタで処理しました。
一度シーンをレンダリングします。 レンダリングしたテクスチャを画面に張り込むときに、 中心からの距離の2乗の関数でテクスチャ座標を補正してゆがめます。
main.fx 0016: float fCurvature = 1.0; 0130: float4 FishEyePS( in float2 OriginalUV : TEXCOORD0 ) : COLOR 0131: { 0132: half2 pos = OriginalUV * 2.0 - 1.0; 0133: half p = length(pos); 0134: pos = (1 + fCurvature * p * p)/(1+2*fCurvature) * pos; 0135: 0136: return tex2D(RenderTargetSampler, pos * 0.5 + 0.5); 0137: }
とりあえず、対角の4隅の位置が動かないようにパラメータを調整しています。
アスペクト比は考慮していません。やりたい人はお好きにどうぞ。
この今回の欠点は、中央付近が汚くなることと、レンズの幾何情報が適当ということでしょうね(やりたい人は適当に直してください)。