魚眼レンズ


~ Fish Eye ~






■はじめに

アニメ見てたら、画面がゆがんでたんで作ってみました。

今回のプログラムは、次のものです。

まぁ、いつものように適当にファイルが入っています。 大事な部分だけを抜粋すると、次のファイルだけに注目すればいいことになります。

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隅の位置が動かないようにパラメータを調整しています。
アスペクト比は考慮していません。やりたい人はお好きにどうぞ。

■最後に

この今回の欠点は、中央付近が汚くなることと、レンズの幾何情報が適当ということでしょうね(やりたい人は適当に直してください)。





もどる

imagire@gmail.com