我正在开发一个项目,用于移植我的CUDA代码以供使用 作为一个维护自己的大型应用程序的模块 OpenGL状态。我的模块基本上是一个体积渲染器。 我现在面临的问题是我必须设置射线 体积渲染器完全模仿OpenGL相机, 这样我的体积渲染就适合渲染场景的其余部分。
在调用我的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
乘以逆观察矩阵。
完整的固定代码:
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);
c_inViewMatrix
是逆视图矩阵。
答案 0 :(得分:3)
此问题已由原始海报内联回答。答案是将u *= -c_pp.right
更改为u *= c_pp.right
(符号更改)。往上看。
我添加了这个答案,以减少CUDA标签中未答复的问题的数量,以帮助提高它的实用性。