2011-07-14 5 views
4

私は、 用の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 

uv-1から1に実行されている正規化されたスクリーン座標です。 c_ppは、top,rightおよびnearを使用してビュー錐台を説明しています。 と掛け合わなければならない適切な行列を探していますので、eyeRay.dが正しい方向に表示されます。現在のところ、 の表示マトリックスまたはその転置または反転バージョンを使用していませんでした。

更新は:

u *= c_pp.rightu *= -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); 

逆ビュー行列です。

+1

カメラの視界方向をワールドスペースにしたいのであれば、カメラの変換マトリックスの-Z軸でなければなりません(OpenGLのビュー軸が画面を指し示すため、マイナスです)。スペース用語。 – cmannett85

+0

@ cbamver85:あなたのコメントのおかげで私は解決策を見つけました。 c_pp.rightに間違った記号があり、コードをu * = c_pp.rightに変更すると、すべてがeyeRay.dベクトルに逆ビュー行列を掛けて動作します。私のCUDAコードの視線方向をCPUコードで計算したものと比較したところ、何か問題があり、Xコンポーネントには常に間違ったサインがあることが分かりました。 – ineX

答えて

3

この質問はオリジナルのポスターのインラインで回答されています。答えはu *= -c_pp.rightu *= c_pp.right(符号の変更)に変更することです。上記を参照。

私はこの答えを追加して、CUDAタグの未解決の質問の数を減らし、より有用なものにしました。

関連する問題