0

レイマーチング用の opencl カーネルを作成しようとしています。次の例に示すように、結果の画像に顕著な魚眼の歪みがあることを除いて、すべてが機能します: (これは立方体であると想定されています)

問題は、各光線の方向ベクトルを構築する方法にあります。

現在、私はカーネルにカメラの方向をピッチとヨーとして与えています(私のコードでは)pitchyaw

次に、fov ( fov)、カーネルが計算しているピクセルの座標 (ixおよびiy)、およびフレーム全体の幅と高さ( width、 )heightに基づいて、光線の方向のピッチとヨーを取得します。

最後に、前の計算で得られたピッチとヨーを使用して単位ベクトルを作成します。

(varfloatカーネルが double または single 浮動小数点精度で実行されているかどうかに応じて、float または double のいずれかを表します)

上の画像では、fovは Pi/3 で、widthheightは両方とも 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

歪みをなくすために方向ベクトルのピッチとヨーを計算する方法を教えてもらえますか?

4

0 に答える 0