【问题标题】:computing pixel values in photon tracing在光子追踪中计算像素值
【发布时间】:2012-10-04 14:14:48
【问题描述】:

我过去写过两个传统的光线追踪器,但现在我想编写一个反向光线追踪器,它可以追踪从光源到眼点的光子。在过去几天阅读有关此主题的文章后,我知道我不应该尝试,但无论如何我还是想这样做。我现在面临的问题是如何计算我试图生成的图像中每个像素的值。

在普通光线追踪中,我将来自视点的光线通过图像平面中的一个像素射入场景中,在光线树的这个分支被追踪之后,我最终得到一个分配给该像素的颜色值。我想不出办法来扭转这个过程。如果我测试每条光线是否只与图像平面相交,那么我会得到一个 180 度的视野和一个焦点就在图像平面上(一团模糊)。所以我必须测试每条光线是否与图像平面和眼点相交。但由于眼点只是一个非常小的点,光线击中它的机会应该(几乎)为零,这将导致根本没有图像。

所以我的问题是:如何通过追踪来自光源的光子来计算要渲染的图像的像素值?

提前致谢,
一月

【问题讨论】:

  • 您应该知道“光子追踪”不是“光线追踪”的同义词。在计算机图形学领域,“光子追踪”是指一种特定的技术,它将光线命中存储在 3-D 数据库中,与常规光线追踪相比,它用于提高统计收敛性。
  • @comingstorm:我知道光子追踪不是光线追踪,但是有很多不同或相同事物的名称,我可能只是用错了名称。我的意思是:在没有花哨的优化的情况下跟踪从光源到相机/视点的单个光子。
  • 这个术语有点混乱:它要么被称为“反向光线追踪”(因为它与传统光线追踪的方向相反),要么被称为“正向光线追踪”(因为它追踪的方向相同)光的方向)。

标签: algorithm 3d raytracing


【解决方案1】:

您需要进行“最终收集”才能生成图像。如果您的光线树从光源分支出来,这将有效地“装饰”光线树的叶子,并为眼睛添加额外的光线。

当然,并不是每条这样的光线都是有效的:如果表面背对眼睛,或者被遮挡,那么它应该被拒绝。请注意,这种生成光线的方法类似于在常规光线追踪中确定照明所需的“阴影”光线。

另一个问题是,您接收到的光线将采用随机模式,而不是传统光线追踪提供的规则或分布良好的模式。这意味着您需要对相机接收到的光线进行平均和/或插值,以获得像素值。

我相信您的像素颜色将由样本密度样本的颜色值共同决定;如果是这样,您将需要确保您的平均/插值方法提供该行为。对此的初始近似可能只是将输入样本添加到最近的像素;更好的方法可能是为每个传入的样本“喷溅”一个简单的添加剂贴花。一种更复杂的方法可以根据样本的局部密度按比例缩放贴花的大小,同时保持总积分亮度与样本亮度成比例。


编辑:给定一个传入的“眼睛”光线,您仍然需要确定您的传入光线对应的屏幕位置。为此,您需要计算用于光栅化的相机的“ViewProjection”矩阵。这实际上是用于传统光线追踪的过程的

conventional ray tracing:
    // find direction vector for given screen coordinates (x,y)
    homog4vector homog_clip_coords( (x - x_offset) / x_resolution,
                                    (y - y_offset) / y_resolution,
                                    1.0,  // z-coordinate
                                    1.0); // w-coordinate
    homog4vector homog_world_coords = InverseViewProjectionMatrix * homog_clip_coords
    ray_vector_x = homog_world_coords.x / homog_world_coords.w - eye_x;
    ray_vector_y = homog_world_coords.y / homog_world_coords.w - eye_y;
    ray_vector_z = homog_world_coords.z / homog_world_coords.w - eye_z;

rasterization or "reverse" ray tracing:
    // find screen coordinates for given source point "p"
    homog4vector eye_ray_source(p.x, p.y, p.z, 1.0);
    homog4vector homog_clip_coords = ViewProjectionMatrix * homog4vector(x,y,z,1);
    screen_coords.x = x_offset + x_resolution * homog_clip_coords.x / homog_clip_coords.w
    screen_coords.y = y_offset + y_resolution * homog_clip_coords.y / homog_c.ip_coords.w

当然,并不是每条入射光线都会出现在屏幕上。确保丢弃从后面进入相机的光线:

    if (homog_clip_coords.z < 0 || homog_clip_coords.w < 0)
      { /* reject ray */ }

【讨论】:

  • 非常感谢您的回答。不过,我不太确定它是否回答了我的问题。让我困惑的部分是光线到眼睛的东西,因为光线树的叶子代表光子被吸收(被物体或像平面)吸收的那一刻,然后它不会做任何事了。我将不得不考虑你的答案和我的问题,然后我会报告我的发现。
  • 作为附加提示,我建议考虑与“阴影”射线的相似性。在传统的光线追踪中,您需要将来自光线树的叶子的“阴影”光线添加到光源中,以确定它们终止的表面的照明。但在反向光线追踪中,光源代替相机,而相机代替光源。
  • 哦!现在我懂了。您的回答似乎回答了这个问题,但不幸的是,我的问题并没有像我希望的那样清晰。很抱歉打扰您,感谢您的宝贵时间!
  • 感谢采纳;我认为你的问题是一个很好的问题。我试图回答您似乎遇到的问题以及所提出的问题,但我似乎跳过了您正在寻找的细节。我添加了一个部分,希望对此有所帮助...
猜你喜欢
  • 2012-05-23
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 2019-10-28
  • 2013-02-26
  • 2014-12-30
相关资源
最近更新 更多