【Ray Tracing】光线追踪基本概念与代码实现

本文深入探讨了光线追踪的基本概念,包括算法原理、基本框架和元素,如空间几何体、光线、反射、折射和颜色计算。介绍了冯氏光照模型、阴影计算方法,以及软阴影和抗锯齿的技术。此外,还讨论了镜头和纹理的应用,以及通过C++实现光线追踪的基本步骤,包括建立坐标系、向量类、光模型和摄像机模型。
摘要由CSDN通过智能技术生成

I. 基本概念

这里写图片描述

具体的概念, 这里有一个很不错的 paper (https://raw.githubusercontent.com/quietshu/-paper-cg-RayTracing/master/RayTracing.pdf), 下载不下来的话,走这里。以下内容,引自这个paper。

光线追踪(Ray Tracing)算法是一种计算机三维图形渲染算法,其基本出发点就是追踪光线,模拟真实的光路和成像过程。相比于其他大部分渲染算法,光线追踪算法的优势是可以提供更为真实的光影效果,劣势是计算量巨大。

基于对自然界光路的研究,光线追踪采取逆向计算光路来还原真实颜色。模拟的过程中涵盖了光的反射、折射、吸收等特性(精确计算),并辅以其他重要渲染思想(模拟)。其中包含了重要方法,诸如冯氏光照模型(Phong Shading)、辐射度(Radiosity)、光子映射(Photon Mapping)、蒙特卡洛方法(Monto Carlo) 等等。

鉴于光线追踪算法对场景仿真程度之高,其被普遍认为是计算机图形学的核心内容,以及游戏设计、电影特效等相关领域的未来方向。近年来,由于硬件系统的迅速改良,基于分布式、GPU,甚至实时渲染的光线追踪算法也纷纷出现。

算法原理

从视点出发向屏幕上每一个像素发出一条光线,追踪此光路并计算其逆向光线的方向,映射到对应的像素上。如下图,通过计算光路上颜色衰减和叠加,即可基本确定每一个像素的颜色。

这里写图片描述

基本框架

首先实现完整的空间向量类,包括相交检测、计算光线反射和折射。对反射和折射后的光线递归计算颜色再叠加起来即可算得原光线颜色。若光线未遇到任何物体则返回背景色。

在递归的过程中,光亮会不断衰减。因此可以限制迭代的深度或者光亮小于特定值时停止迭代。

将对应于每一个像素的光线颜色绘制到图片文件的相应坐标,最后输出绘制所得图像。光线颜色的基本递归算法伪代码如下

input : 光线的出发位置和方向向量
output : 反向光颜色

-----------------------------------------
function rayColor()

if no intersection with any object then
    return background color
else
    obj <- find nearest object from the ray;
    reflect ray <- calculate reflect ray with obj;
    refract ray <- calculate refract ray with obj;
    main color <- the radiance of obj;
    reflect color <- rayColor(reflect ray);
    refract color <- rayColor(refract ray);
    return mix(main color, reflect color, refract color);

基本元素

空间几何体

对于任意的几何体,都需要建立特定函数 f(x) f ( x ) 。自变量 x x 表示空间点的坐标,则

f ( x ) = { 1 , 点  x  在几何体外部 0 , 点  x  在几何体表面上 1 , 点  x  在几何体内部

空间光线

光线的参数方程

p=s+td p = s + t d
, 其中

  • s s 是光线的起点坐标
  • d d 是光线的方向向量
  • t</
  • 22
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值