美文网首页
光线追踪介绍

光线追踪介绍

作者: android小奉先 | 来源:发表于2022-02-13 16:12 被阅读0次

摘要
图像渲染就是一个这样的过程,输入一组物体,输出一个像素矩阵。把这个像素矩阵输送给显卡,显示器上就可以显示出来图像。本篇介绍下这个过程用到的算法,就是光线追踪。

算法介绍

光线追踪的思路就是从视角发出光线,分别经过屏幕上的每个像素,这样的光线经过屏幕后,找到相交的首个#物体位置,这就是该像素对应的物体,然后再从物体相交点到光源投射一条光线,这时候就可以计算像素值。如下图所示:


光线追踪示意图

从图中可以抽象出要计算一个点的像素值,需要以下步骤:

  1. 产生光线,计算从视角经过像素的每条光线
  2. 计算光线与物体的相交点
  3. 计算阴影

产生光线

接下来先看第一个问题,产生光线。
要表示光线,那么就需要了解下正交投影和透视投影。正交投影就是假设光线是从一个方向发出的,这样现实中平行的物体最后的投影也是平行的,而透视投影就是假设光线是从一个点发出的,这样平行的物体就会在远处相交。
如下图所示:


正交投影
透视投影

透视投影对于我们更接近真实情况,比如我们看平行的两条铁轨,这两条铁轨会在远方的一个点处“相交”。
光线可以表示成如下公式:


image.png

e是视点,s是屏幕上一个像素位置。
参考图如下:


image.png

光线与物体相交

接下来就是第二个问题,怎样计算光线和物体的交点。

物体也可以用一个平面方程表示 image.png
对于一个点,如果满足该函数,那么就可以认为该点在物体表面上。问题1将光线表示出来了,那么这儿只需要将光线作为点代入这个平面方程,通过计算参数t就可以知道是否相交,也可以计算出相交点。不过这样的计算量会比较大,而且需要用一个方程表示平面,难度也不小。下面介绍一种方法,可以比较直观的计算出交点。

我们知道在渲染的时候,是按照三角形来的,那么我们也可以把物体表面看成是n个三角形构成的,那么这时候只需要计算光线和三角形的交点就行。
假设目标三角形的三个顶点是a,b,c。这时候求交公式就可以表示为如下:


image.png
等式右边表示的是交点,如果满足如下公式,那么说明点在三角形内,否则就是三角形外。
image.png ,
这时候可以把方程写成矩阵格式,如下:
image.png

这时候按照克莱姆法则,就可以直接计算出解了:


image.png
image.png

这时候交点问题也解决了。

阴影计算

阴影计算的一种基础算法是Blinn-Phong模型,将光照模型分为3部分,漫反射,高光,环境光。

漫反射

光源直射的表面会比光源斜射的部分亮一些,基于该假设就可以认为表面法线和入射光的角度越接近,那么能量越高,参考图如下。


image.png

向量的点乘可以表示两个向量方向的接近程度,那么漫反射公式就可以写成如下:


image.png

高光

如果观察方向正好是入射光的反射方向,那么这时候接收的能量也比较多,而离反射方向越远,接收的能量也会越少。用图表示如下:


image.png

描述观察方向和反射光方向的接近程度可以用观察方向和入射方向的二等分量和表面法线的接近程度来表示。那么这时候就可以得到高光的表示公式:


image.png

环境光

在没有光源的时候,我们还是可以看到物体的,这是因为虽然没有光源,不过周围的物体也会反射一些光,这样的光就是环境光,可以简化成用一个常数表示。


image.png

在有多个光源的时候,漫反射和高光就需要对每个光源单独计算并累加。最终公式如下:


image.png

阴影

可以从交点朝着光源望去,如果可以看到光源,那么该交点不在阴影中,如果看不到光源,那么该交点就在阴影中。如下图所示:


image.png

这时候整个光线追踪的流程可以写成如下形式:


image.png

相关文章

  • 光线追踪介绍

    正向追踪 如果我们试着在计算机生成图像这一过程中模拟光线与物体的交互,那么我们除了明白光线会在物体表面反射外,还需...

  • 光线追踪介绍

    摘要图像渲染就是一个这样的过程,输入一组物体,输出一个像素矩阵。把这个像素矩阵输送给显卡,显示器上就可以显示出来图...

  • 实现光线追踪算法

    接下来我们介绍光线追踪算法,用于实现我们的第一个光线追踪器。 首先,我们可以发现自然实际中光线的传播只是大量从光源...

  • 利用rayrender动态可视化全球人口密度

    介绍 rayrender 是一个R语言编写的开源包,用于创建光线跟踪场景。这个包为用 C++ 构建的光线追踪器提供...

  • 体积的使用 光线追踪

    简介: Unity HDRP 在 Unity2019 版已经支持光线追踪了,在设置中开启光线追踪后(开启方法[ht...

  • 光线追踪算法综述

    Problem Formulation Ray Tracing的目标是生成一张包含场景内物体,具有真实感的图像,因...

  • 221231 光线追踪练习

    烟火追着你冷去的时间追着你你不要逃,不要逃 钟声追着你没做完的梦追着你你不要逃,不要逃 所有双向反射函数都为你备好...

  • 计算机仿真技术_1

    全局光照模型里面最著名的技术就是光线追踪算法(ray-tracing)。 所谓的光线追踪就是为了在全局光照模型下实...

  • 英伟达发了新显卡很了不起,但是我觉得你们没必要这么兴奋

    英伟达前几天发布了新的专业显卡Quadro RTX 系列,已经可在以单张卡实现光线追踪,并且也放了相应的光线追踪技...

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

    一、回顾 1、理解 上节通过光栅化和光线追踪的对比,引入光线追踪。 在光栅化中,其实就是构建网格,然后在像素网格中...

网友评论

      本文标题:光线追踪介绍

      本文链接:https://www.haomeiwen.com/subject/easflrtx.html