3D渲染-光线追踪-包围盒

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3D渲染-光线追踪-包围盒相关的知识,希望对你有一定的参考价值。

参考技术A

上节通过光栅化和光线追踪的对比,引入光线追踪。

在光栅化中,其实就是构建网格,然后在像素网格中放入物体。对于每个物体,通常会观察该物体所覆盖的每个像素。

在光线追踪中,则颠倒此循环过程,首先确定每个像素,然后去查看每个物体,判断物体能否覆盖相应像素。换言之,将相机(起点)与一个像素点连线,发出射线,然后观察每个物体被光源照亮情况,将每个交点的着色值加权和写入像素值。

解释了Whitted-Style Ray Tracing的原理,并讲解了如何进行光线和场景中物体求交问题。

之前每一个像素都需要与场景中所有三角形求交。
即:algorithm = pixels ✖️ traingles
可以向想象:一个成像平面上有很多个像素,一个场景中由很多三角形构成。每一个像素都要与场景中全部三角形求交,非常慢。

使用包围盒进行加速。

一般使用的包围盒是长方体。
对长方体的理解:由三个不同的对面形成的交集。如下图

使用包围盒计算更方便。使用轴对齐包围盒,计算更方便。如下图:

先以2D的为例。
1、光线先与x轴上两对面,求交点。
2、光线再与y轴上两对面,求交点。
3、将1和2求交集,即光线在2D包围盒里的区域。
如下图:

扩展到3D:
1、当光线进入了全部的对面时,则光线进入包围盒。
2、当光线只要离开任意一个对面时,则光线离开包围盒。
即:T enter = max t min T exit = min t max
当T enter < T exit 时,说明光线在包围盒内一段时间。

由于光线是一条射线。
当 T exit < 0 时,说明光线在包围盒的背后,不会有交点。
当 T enter < 0 且 T exit > 0 时,说明光线在包围盒里,有交点。
总结:光线与包围盒(AABB)有交点,当且仅当 T enter < T exit && T exit > 0

整合多个光线追踪样本

【中文标题】整合多个光线追踪样本【英文标题】:Integrating multiple raymarching samples 【发布时间】:2014-05-26 16:54:43 【问题描述】:

假设我正在使用 raymarching 来渲染场函数。 (这是在 CPU 上,而不是在 GPU 上。)我有一个类似这样粗略编写的伪代码的算法:

pixelColour = arbitrary;
pixelTransmittance = 1.0;
t = 0;
while (t < max_view_distance) 
  point = rayStart + t*rayDirection;
  emission, opacity = sampleFieldAt(point);
  pixelColour, pixelTransmittance =
      integrate(pixelColour, pixelTransmittance, emission, absorption);
  t = t * stepFactor;

return pixelColour;

逻辑真的很简单...但是integrate() 是如何工作的?

每个样本实际上代表我领域中的一个体积,而不是一个点,即使样本是在一个点上采集的;因此对最终像素颜色的影响将根据体积的大小而有所不同。

我不知道该怎么做。我环顾四周,但是虽然我发现了很多代码(通常在 Shadertoy 上),但它们的作用都不同,我找不到任何解释原因。这是如何工作的,更重要的是,哪些神奇的搜索词可以让我在 Google 上查找它?

【问题讨论】:

...在网络上花费了相当长的时间进行研究之后,当我发现一篇看起来很有希望的关于该主题的文章时,我感到非常兴奋。原来是这个问题。呸。 【参考方案1】:

这是比尔-兰伯特定律,它通过参与的同质媒体来控制灭绝。难怪我找不到任何有效的关键字。

There's a good writeup here,它告诉我几乎所有我需要知道的信息,尽管它确实掩盖了相位函数的计算。但至少现在我知道该读什么了。

【讨论】:

以上是关于3D渲染-光线追踪-包围盒的主要内容,如果未能解决你的问题,请参考以下文章

GAMES202 笔记-实时光线追踪

减少光线追踪时的计算

为啥我们使用 CPU 而不是 GPU 进行光线追踪?

Threejs中用于无线光线追踪的自定义渲染器和灯光?

光线追踪(RayTracing)算法理论与实践入门

光线追踪框相交