レイマーチング用の opencl カーネルを作成しようとしています。次の例に示すように、結果の画像に顕著な魚眼の歪みがあることを除いて、すべてが機能します: (これは立方体であると想定されています)
問題は、各光線の方向ベクトルを構築する方法にあります。
現在、私はカーネルにカメラの方向をピッチとヨーとして与えています(私のコードでは)pitch
。yaw
次に、fov ( fov
)、カーネルが計算しているピクセルの座標 (ix
およびiy
)、およびフレーム全体の幅と高さ( width
、 )height
に基づいて、光線の方向のピッチとヨーを取得します。
最後に、前の計算で得られたピッチとヨーを使用して単位ベクトルを作成します。
(varfloat
カーネルが double または single 浮動小数点精度で実行されているかどうかに応じて、float または double のいずれかを表します)
上の画像では、fov
は Pi/3 で、width
とheight
は両方とも 500 でした。
unsigned int ix = get_global_id(0);
unsigned int iy = get_global_id(1);
//PROBLEM LIES IN THESE 3 LINES:
varfloat y = yaw - fov/2.0 + fov*ix/width; //get yaw using horizontal fov
varfloat f = (fov * height) / width; //calculate vertical fov from horizontal fov scaled proportionally based on width and height
varfloat p = pitch - f/2.0 + f*iy/height; //get pitch using vertical fov
varfloat3 direction = {sin(y)*cos(p), cos(y)*cos(p), sin(p)}; //unit vector for ray direction
歪みをなくすために方向ベクトルのピッチとヨーを計算する方法を教えてもらえますか?