【问题标题】:Ray setup in CUDA using OpenGL-supplied matrices使用 OpenGL 提供的矩阵在 CUDA 中设置光线
【发布时间】: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

uv 是从-11 的标准化屏幕坐标。 c_pp 使用 toprightnear 描述视锥。 我现在正在寻找我必须与之相乘的适当矩阵 以便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 组件一直都有错误的符号。

标签: opengl cuda


【解决方案1】:

这个问题已由原始海报内联回答。答案是将u *= -c_pp.right 更改为u *= c_pp.right(符号更改)。看上面。

我已添加此答案以减少 CUDA 标记中未回答问题的数量,使其更有用。

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2017-05-30
    相关资源
    最近更新 更多