【发布时间】:2012-02-21 06:14:37
【问题描述】:
我正在开发一个项目,我在该项目中移植了我的 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 是逆视图矩阵。
【问题讨论】:
-
如果只想要相机在世界空间的视角方向,应该是相机变换矩阵的-Z轴(减去因为OpenGL的视角轴指向屏幕外),提供相机本身仅在世界空间术语中描述。
-
@cbamver85:感谢您的评论,我找到了解决方案; c_pp.right 有错误的符号,将代码更改为 u *= c_pp.right 并且一切都通过将 eyeRay.d 向量与逆视图矩阵相乘来工作。在将我的 CUDA 代码的查看方向与我在 CPU 代码中计算的方向进行比较后,我发现有什么不对劲,结果证明 X 组件一直都有错误的符号。