问题标签 [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 回答
2752 浏览

c++ - OpenGL 渲染与自己的 Phong 照明实现

我使用以 (0,0,0) 为中心并直接查看球体基元的相机实现了 Phong 照明方案。以下是场景文件的相关内容,用于使用OpenGL查看场景以及使用我自己的实现来渲染场景:

这里

由 OpenGL 生成的结果图像。

这里

我的渲染应用程序生成的图像。

如您所见,两者之间存在各种差异:

  1. 我图像上的高光比 OpenGL 中的要小。
  2. 漫反射表面似乎没有以正确的方式漫反射,导致我的图像中的黄色区域不必要地大,而在 OpenGL 中,靠近球体底部有一个漂亮的深绿色区域
  3. OpenGL 产生的颜色比我图像中的颜色深得多。

这是我看到的最突出的三个差异。以下是我对 Phong 照明的实现:

以下是相关的 LightIntensity(...) 和 LightDirection(...) 函数:

对于任何明显的实施错误,我将不胜感激。我想知道是否可能仅仅因为 OpenGL 用于显示的伽马值和我的显示器的默认伽马值而发生差异。我也知道 OpenGL(或至少我提供的部分)不能在对象上投射阴影。并不是说这与所讨论的问题相关,但它只是让我想知道它是否只是 OpenGL 与我正在尝试做的事情之间的显示和功能差异。

谢谢您的帮助。

0 投票
3 回答
2765 浏览

c++ - 给定相机和视图平面的 2D 点的 3D 坐标

我希望通过观察平面从相机生成光线。为了做到这一点,我需要我的相机位置(“眼睛”),向上、向右和朝向矢量(其中朝向是相机朝向相机正在查看的对象方向的矢量)和 P,观察平面上的点。一旦我有了这些,生成的光线就是:

其中 t 是沿射线的距离(现在假设 t = 1)。

我的问题是,我如何获得点 P 的 3D 坐标,因为它位于观察平面上的位置 (i,j)?假设给定观察平面的左上角和右下角。

注意:观察平面实际上并不是一个平面,因为它不会在所有方向上无限延伸。相反,人们可能会认为这个平面是一个宽x高的图像。在 x 方向,范围是 0-->width,在 y 方向,范围是 0-->height。我希望找到第 (i,j) 个元素的 3D 坐标,0

0 投票
1 回答
597 浏览

c++ - c++递归错误

我有以下递归代码,但它的行为不符合预期(请参阅下面的详细信息):

除了ComputeIntersectionNode(...)递归调用之外,程序中的多条光线也会调用 this 。为了测试这个函数,我运行它 4rays和 4 nodes(或者更准确地说,一个roottype node,它没有 a shape,但有 4 children,每个都有一个shape)。对于测试,每个都与一个/ray相交。nodeshape

当我第一次在 GDB 中运行代码时ray,它首先通过root没有 的代码,shape所以它直接转到children. 它正确计算第一个孩子的交集并正确设置closest_inter变量,该变量返回到最高级别的递归,并child_interclosest_inter此处设置为child_inter.hit = 1;

然后,处理第二个孩子。ComputeIntersectionShape(...)不返回与第二个孩子 ( shape_inter.hit == 0;) 的交集 - 这是预期的行为。但是,当函数返回到最高级别的递归时,由于某种原因 child_inter.hit 被设置为 1(但应该设置为 0)。

有什么建议么?

先感谢您。

0 投票
1 回答
788 浏览

raytracing - 使用矩阵变换进行场景遍历期间的 Ray-Box 相交

有几种方法可以测试我的光线盒交叉点:

  1. 使用 ComputeIntersectionBox(...) 方法,它将射线和盒子作为参数,并计算射线和盒子最近的交点。该方法通过与盒子的每个面形成一个平面并找到与每个平面的交点来工作。一旦找到交点,通过检查交点是否在角点之间来检查该点是否在盒子的表面上。当我在两个不同的盒子上运行这个算法后查看光线时,我得到了正确的交点。

  2. 在具有两个球体、一个十二面体(三角形网格)和两个框的场景上使用 ComputeIntersectionScene(...) 方法而不使用矩阵变换。ComputeIntersectionScene(...) 递归遍历场景图的所有节点并计算与给定光线最近的交点。该测试尤其不应用父节点可能具有的任何也需要应用于其子节点的转换。通过这个测试,我还获得了正确的交叉点。

  3. 使用带有矩阵变换的 ComputeIntersectionScene(...) 方法。此测试与上述测试类似,只是在找到光线与场景中的节点之间的交点之前,使用节点变换矩阵的逆矩阵将射线转换为节点的坐标系,并且在计算交点后,此交点通过将变换矩阵应用于交点,将其变换回世界坐标。

当用第 3 种方法在 2 中描述的同一场景文件上进行测试时,用 4 条射线进行测试(因此,一条射线与一个球体相交,一条射线与另一个球体相交,一条射线与一个盒子相交,一条射线与另一个盒子相交),仅两个球体相交,两个盒子没有相交。当我调试查看我的 ComputeIntersectionBox(...) 方法时,它实际上告诉我射线与盒子上的每个平面相交,但每个交点并不位于盒子上。

这似乎是一种奇怪的行为,因为当使用没有转换的测试 2 时,我获得了正确的框相交(因此,我相信我的光线框相交是正确的),当使用带有转换的测试 3 时,我获得了正确的球体相交(因此,我相信我的转换光线应该没问题)。

有什么建议我可能会出错吗?

先感谢您。

0 投票
1 回答
2916 浏览

mapreduce - 用 opencl 解决一个经典的 map-reduce 问题?

我正在尝试将一个经典的 map-reduce 问题(可以与 MPI 很好地并行)与 OpenCL,即 AMD 实现并行。但结果让我很困扰。

我先简单介绍一下问题。有两种类型的数据流入系统:特征集(每个参数 30 个)和样本集(每个参数 9000 多个维度)。这是一个经典的 map-reduce 问题,因为我需要计算每个样本(Map)上每个特征的得分。然后,总结每个特征的总体得分(减少)。大约有 10k 个特征和 30k 个样本。

我尝试了不同的方法来解决这个问题。首先,我尝试通过特征来分解问题。问题是分数计算由随机内存访问组成(选择 9000 多个维度中的一些并进行加/减计算)。由于我无法合并内存访问,因此需要成本。然后,我尝试通过样本分解问题。问题是总分的总和,所有线程都在竞争很少的分数变量。它不断覆盖原来不正确的分数。(我不能先进行个人评分,然后再总结,因为它需要 10k * 30k * 4 个字节)。

我尝试的第一种方法在具有 8 个线程的 i7 860 CPU 上给了我相同的性能。但是,我不认为这个问题是无法解决的:它与光线追踪问题非常相似(您需要针对数百万条三角形进行数百万条光线的计算)。有任何想法吗?

此外,我发布了一些我拥有的代码:

按特征分解(有效,但速度慢):

按样本分解,不起作用:

0 投票
5 回答
12289 浏览

algorithm - 射线箱相交理论

我希望确定光线和盒子之间的交点。盒子由它的最小 3D 坐标和最大 3D 坐标定义,射线由它的原点和它指向的方向定义。

目前,我正在为盒子的每个面形成一个平面,并将射线与平面相交。如果光线与平面相交,那么我检查相交点是否实际上在盒子的表面上。如果是这样,我检查它是否是这条射线最近的交点并返回最近的交点。

我检查平面交点是否在盒子表面本身的方法是通过一个函数

其中corner1是该框面的矩形的一个角,corner2是对角。我的实现大部分时间都有效,但有时它给了我错误的交集。请看图片:

替代文字

该图像显示了来自相机眼睛并撞击盒子表面的光线。其他光线是盒子表面的法线。可以看出,特别是一条光线(实际上是看到的法线)从盒子的“背面”出来,而法线应该从盒子的顶部出来。这似乎很奇怪,因为有多个其他光线正确地击中了盒子的顶部。

我想知道我检查交点是否在盒子上的方式是否正确,或者我是否应该使用其他算法。

谢谢。

0 投票
1 回答
743 浏览

physics - 使用 Phong 模型的点光源照明

我希望使用 Phong 照明方案渲染一个包含一个盒子和一个点光源的场景。以下是我计算的相关代码片段:

我相信错误一定是在函数LightDirection(...)LightIntensity(...)函数中的某个地方,因为当我使用定向光源运行我的代码时,我获得了所需的渲染图像(因此这让我相信 Phong 照明方程是正确的)。此外,在 Phong(...) 中,当我计算intensity_diffuse和调试时,我除以light_color10,得到的结果图像看起来更像我需要的图像。我计算light_color正确吗?

谢谢。

0 投票
1 回答
631 浏览

3d - 光线追踪 3D 到 2D 中的软阴影

我希望在我的光线追踪器中实现由区域光产生的柔和阴影。我无法生成随机样本。所以我有一个场景,其中我有一个区域光(表示为一个圆),它的中心的世界(x,y,z)坐标是给定的,半径是给定的,圆所在平面的法线是给定,以及颜色和衰减因子。

我希望使用的采样方案如下:在包含圆的四边形上生成样本并丢弃圆外的点,直到找到所需数量的圆内的样本。我无法理解如何将圆心的 3D 坐标转换为其 2D 表示(我认为我不能假设圆的投影在 xy 轴上,因此只需摆脱z 分量)。我认为应该使用飞机正常信息,但我不确定如何使用。

任何和所有的建议表示赞赏。

0 投票
2 回答
1816 浏览

math - 确定 3D 点是否在 2D 圆内

我希望确定点 P(x,y,z) 是否在由其中心 C (cx, cy, cz)、半径 R 和圆位于 N 上的平面所定义的 3D 空间中的 2D 圆内。

我知道位于 3D 空间中 2D 圆上的点 P 定义为:

P = R*cos(t) U + R sin(t)*( N x U ) + C

其中U是从圆心到圆上任意一点的单位向量。但是给定一个点 Q,我怎么知道 Q 是在圆上还是在圆内?选择什么合适的参数t?我要比较点 Q 的哪些坐标以查看它们是否在圆内?

谢谢。

0 投票
1 回答
82 浏览

graphics - “.OFF”说明

我想制作一个使用网格和图元(如球体、圆柱体、盒子等)的场景。我想知道是否有关于在哪里可以找到描述复杂网格的 .off 文件的任何建议,例如山脉、岩石、树木、动物等。