问题标签 [raytracing]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
483 浏览

math - 为相机投影屏幕

我试图通过编写一个简单的光线追踪器来学习更多关于vectormath的知识,并且我一直在阅读它,但我无法找到如何确定主光线的方向。这听起来像一个简单的问题,可能是,但以我目前的知识,我无法弄清楚。

我想我需要一个相机(只不过是一个位置和一个方向作为矢量),然后我从相机将主光线发射到相机前面的屏幕上,它代表最终图像。我无法弄清楚的是屏幕的角坐标。如果我知道屏幕,找到主光线的方向很容易。

我希望可以只使用不需要任何旋转矩阵的简单数学来计算屏幕。我最好的猜测是:

我将相机的方向作为矢量,这个方向等于投影屏幕平面的法线。所以我有屏幕的法线,从那里我可以很容易地计算出屏幕的中心,即:

其中距离是屏幕和相机之间的距离。但是,这就是我迷路的地方,我无法找到一种方法来确定相机任意方向的平面角坐标。

你们有人能帮我吗?如果我的方法不可能奏效,那该怎么办?

0 投票
4 回答
496 浏览

graphics - 有效计算观察光线和一组对象之间的第一个交点的最佳方法是什么?

例如:

一种有效计算视线与一组三个对象之间的第一个交点的方法:一个球体、一个圆锥体和一个圆柱体(其他 3D 图元)。

0 投票
5 回答
1205 浏览

c# - 我的软阴影代码有什么问题?

我正在尝试编写一个简单的光线追踪器作为一个爱好项目,现在一切正常,除了我根本无法使用软阴影。我对软阴影的想法是,光源被认为具有位置和半径。为了对这盏灯进行阴影测试,我将主光线照射到场景中的对象处,然后向光源投射 n 条光线,其中每条新光线在每个轴上都有一个随机分量,其中随机分量会发生变化在 -radius 和半径之间。

如果这样的射线击中场景中的对象,我会增加一个 hitcounter(如果射线击中多个对象,它仍然只会增加一个)。如果它在没有碰撞的情况下到达光源,我将主光线的交点到光源中心的距离添加到一个变量中。

当采集了 n 个样本时,我计算碰撞的光线的比率,并将光的颜色乘以该比率(因此颜色为 1000,1000,1000 的光将以 0.5 的比率变为 500,500,500,其中一半的光线发生了碰撞)。然后我通过将较早的距离变量除以非碰撞光线的数量来计算到光源的平均距离。我返回那个变量并且函数退出。

问题是:它不起作用。至少不完全是。在这里可以看到它的样子。你可以看到它有点像软阴影,如果你用力眯眼的话。

我不明白,我是在这里制造了某种根本性的缺陷,还是很小的东西?我相当肯定问题出在这种方法上,因为当我计算这种方法直接产生的部分点亮像素的数量时,只有大约 250 个,而应该有更多。当您仔细查看图片时,您会看到一些部分点亮的像素,这表明其余代码处理部分点亮的像素就好了。

这是软阴影类的实际光线:

0 投票
3 回答
7577 浏览

math - 如何计算入射角?

我正在为一个大型项目开发光线追踪器,目标是在不担心 CPU 时间的情况下生成逼真的渲染。基本上是预渲染,所以我要追求准确性而不是速度。

我在理解事物照明方面的一些更高级的数学时遇到了一些麻烦。基本上,我的观点是有道理的。假设没有距离衰减,我应该能够使用我找到的多边形上的点,并将该点的法线与光线的入射角进行比较,以计算出我的照明值。因此,给定平面上的一个点、该平面的法线和点光源,我将如何计算出该角度?

我问的原因是我似乎找不到任何关于找到入射角的参考。我可以找到很多参考资料,详细说明一旦获得它该怎么做,但没有告诉我如何首先获得它。我想这很简单,但我无法将其逻辑化。

谢谢

0 投票
12 回答
14864 浏览

c# - 什么时候结构是答案?

我正在做一个光线追踪器爱好项目,最初我使用结构体作为我的 Vector 和 Ray 对象,我认为光线追踪器是使用它们的完美情况:你创建了数百万个它们,它们的寿命不会超过一个方法,它们是轻量级的。然而,通过简单地将 Vector 和 Ray 上的“struct”更改为“class”,我获得了非常显着的性能提升。

是什么赋予了?它们都很小(向量 3 个浮点数,射线 2 个向量),不要过度复制。当然,我确实会在需要时将它们传递给方法,但这是不可避免的。那么,在使用结构时会导致性能下降的常见陷阱有哪些?我读过这篇MSDN 文章,内容如下:

当您运行此示例时,您会发现结构循环的速度要快几个数量级。但是,当您将它们视为对象时,请注意使用 ValueTypes 是很重要的。这会为您的程序增加额外的装箱和拆箱开销,并且最终可能会比您卡在对象上的成本更高!要查看实际情况,请修改上面的代码以使用 foos 和 bar 数组。您会发现性能或多或少相等。

然而,它已经很老了(2001 年),整个“把它们放在一个数组中导致装箱/拆箱”让我觉得很奇怪。真的吗?但是,我确实预先计算了主光线并将它们放在一个数组中,所以我接受了这篇文章并在需要时计算了主光线,并且从未将它们添加到数组中,但它并没有改变任何东西:类,它仍然快 1.5 倍。

我正在运行 .NET 3.5 SP1,我相信它解决了 struct 方法从未内联的问题,因此也不可能是这样。

所以基本上:任何提示,要考虑的事情以及要避免什么?

编辑:正如一些答案中所建议的,我已经建立了一个测试项目,我尝试将结构作为参考传递。添加两个向量的方法:

对于每个我都有以下基准方法的变体:

一切似乎都表现得几乎相同。它们是否有可能被 JIT 优化为传递此结构的最佳方式?

EDIT2:我必须注意,在我的测试项目中使用结构使用类快大约 50%。为什么这对我的光线追踪器有所不同,我不知道。

0 投票
4 回答
3200 浏览

algorithm - 球体表面上的射线-多边形交点

我有一个点(纬度/经度)和一个以度数为单位的航向(真北),该点正沿着该点移动。我有许多静止的多边形(点在纬度/经度中定义),它们可能是凸面的,也可能不是凸面的。

我的问题是,如何计算与多边形最近的交点(如果有)。我看过一些关于光线追踪的令人困惑的帖子,但是当光线和多边形不在同一个平面上并且多边形必须是凸面时,它们似乎都与 3D 有关。

0 投票
9 回答
13664 浏览

performance - 提高光线追踪器的性能

我正在用 D ( http://dsource.org/projects/stacy ) 编写一个相对简单的光线追踪器/路径追踪器,但即使经过全面优化,每条光线仍需要数千个处理器周期。我还能做些什么来加快速度吗?更一般地说,您知道光线追踪的良好优化/更快的方法吗?

编辑:这是我已经在做的。

  • 代码已经高度并行运行
  • 临时数据以缓存高效的方式结构化,并与 16b 对齐
  • 屏幕分为 32x32 块
  • 目标数组的排列方式使得块中的所有后续像素在内存中都是连续的
  • 执行基本场景图优化
    • 对象的常见组合(如盒子中的平面 CSG)被预先优化的对象替换
  • 能够利用 GDC 的自动矢量化支持的矢量结构
  • 射线上的后续命中是通过惰性求值找到的;这可以防止对 CSG 进行不必要的计算
  • 既不支持也不优先的三角形。仅普通图元,以及 CSG 操作和基本材料属性
  • 支持边界
0 投票
3 回答
9454 浏览

graphics - 光栅化或光线追踪是否有任何渲染替代方案?

光栅化(三角形)和光线追踪是我遇到的唯一渲染 3D 场景的方法。还有其他人吗?另外,我很想知道任何其他真正“外面”的 3D 方法,例如不使用多边形。

0 投票
5 回答
2416 浏览

graphics - 3D 和光线追踪的最佳选择

我想玩一些图形的东西。简单的动画和东西。我也想玩光线追踪。我需要帮助找到一个可以帮助我做这些事情的图书馆。我有几个要求:

  • 必须能够进行光线追踪
  • 必须用于高级语言(python、.NET 等)。请不要使用 C/C++
  • 必须有良好的文档,最好有例子。

有谁知道我可以用来鬼混的好图书馆?

0 投票
4 回答
3204 浏览

algorithm - 您将如何实现完美的视线算法?

免责声明:我实际上并没有尝试制作一个,我只是好奇它是如何完成的。

当我说“最准确”时,我包括了基础知识

  • 距离
  • 光照水平

而且越复杂

  • 大气中的灰尘
  • 雨, 雨夹雪, 雪
  • 植被
  • 抽烟

如果我想对此进行编程,我应该查看哪些资源以及应该注意哪些事项?此外,是否有任何有关视线背后理论的相关书籍,包括所有这些变量?