私は、 用のCUDAコードを、独自の OpenGL状態を維持する大きなアプリケーションのモジュールとして移植するプロジェクトに取り組んでいます。私のモジュールは基本的にボリュームレンダラーです。 私はボリュームレンダラの をOpenGLカメラのように正確に模倣するように設定しなければならないという問題に直面しています。 レンダリングされたシーンの残りの部分にボリュームレンダリングが収まるようにします。OpenGLが提供する行列を使用したCUDAでのレイセットアップ
私のCUDAコードが呼び出される時点では、表示行列 (モデルビュー行列なし)と投影行列セットがあります。 私はすでに錐台パラメータとカメラ位置 を世界の空間に抽出しました。
u *= -c_pp.right;
v *= -c_pp.top;
Ray eyeRay;
eyeRay.o = make_float3(c_camPosition); //origin
eyeRay.d = normalize(make_float3(u, v, -c_pp.near)); //direction
u
とv
は-1
から1
に実行されている正規化されたスクリーン座標です。 c_pp
は、top
,right
およびnear
を使用してビュー錐台を説明しています。 と掛け合わなければならない適切な行列を探していますので、eyeRay.d
が正しい方向に表示されます。現在のところ、 の表示マトリックスまたはその転置または反転バージョンを使用していませんでした。
更新は:
u *= c_pp.right
にu *= -c_pp.right
を変更し、すべてが逆閲覧行列でeyeRay.d
を乗じて に動作します。
完全固定コード:c_inViewMatrix
と
u *= c_pp.right;
v *= -c_pp.top;
Ray eyeRay;
eyeRay.o = make_float3(c_camPosition); //origin
eyeRay.d = make_float3(u, v, -c_pp.near)); //direction
eyeRay.d = mul(c_invViewMatrix, eyeRay.d);
逆ビュー行列です。
カメラの視界方向をワールドスペースにしたいのであれば、カメラの変換マトリックスの-Z軸でなければなりません(OpenGLのビュー軸が画面を指し示すため、マイナスです)。スペース用語。 – cmannett85
@ cbamver85:あなたのコメントのおかげで私は解決策を見つけました。 c_pp.rightに間違った記号があり、コードをu * = c_pp.rightに変更すると、すべてがeyeRay.dベクトルに逆ビュー行列を掛けて動作します。私のCUDAコードの視線方向をCPUコードで計算したものと比較したところ、何か問題があり、Xコンポーネントには常に間違ったサインがあることが分かりました。 – ineX