game101 作业5

本文介绍了GAMES101作业五的内容,涉及光线追踪的基本原理和流程。通过光线与三角形求交的算法,解释了Whitted-Style光线追踪方法。文章详细阐述了光线的发射、折射和反射,以及如何计算交点颜色,同时提到了菲涅尔方程在透明表面处理中的应用。此外,还讨论了像素坐标系的转换和观察方向的计算。
摘要由CSDN通过智能技术生成

虚拟机代码:
作业五的任务是写一个简单的光线追踪

整体流程说明
光线传输、光线与三角形求交。我们采用了这样的方法寻找光线与场景的交点:
1,遍历场景中的所有物体,判断光线是否与它相交。在场景中的物体数量不大时,该做法可以取得良好的结果,
2,但当物体数量增多、模型变得更加复杂,该做法将会变得非常低
效。

理论依据
Whitted-Style 光线追踪
在这里插入图片描述
步骤:
1,假设人眼就一个光源,所有的光线都是从人眼发出,人眼前是一个离散的二维平面,对于二维平面的每个像素点向外射出一条射线,打到三维物体上,此时会发生折射和反射

2,和光源直接连接每个折射点和散射点,观察光源是否能够到达这些点,通过深度就可以测得

3,然后每个光源可见的点,都是一条光路,此时分为首次光源和二次光源,将这些光路的能量汇总起来,就是一个像素点所得到的所有光的能量

求dir和三角形平面是否相交
依据的公式
O + tD = αA + βB + (1- α - β)C
依据上面的公式就可以推出 S S1 S2 E1 E2 的结果
在这里插入图片描述

castRay函数如何理解?
1,此函数用于计算交点处的颜色;
2,如果相交对象的材质为反射和折射,我们计算反射/折射方向,并向场景中投射两条新光线;
3,当表面是透明的,我们使用菲涅尔方程的结果混合反射和折射颜色,菲涅尔方程计算反射和折射量取决于曲面法线、入射视图方向表面折射率;
4,如果表面是漫反射我们使用Phong照明模型来计算颜色

计算从像素平面发射出去的观察方向
步骤
1,因左上角为(0,0),右下角为(scene.width, scene.height),先将像素坐标系归一化到(0,1) 则有 (float)i + 0.5)/scene.width)

2,将坐标系从的范围从[0,1] 变换到 [-1,1] ,则有(2*(((float)i + 0.5)/scene.width) - 1),此时左上角的x变为 -1

3,因为像素平面不一定为正方形,则像素的形状不一定为正方形,所以以height为基准,有(2*(((float)i + 0.5)/scene.width) - 1) * imageAspectRati

4,因观察方向基于eye point 的坐标系下,所以最后乘scale,调整基于像素平面的所观察到的范围, float x = (2*(((float)i + 0.5)/scene.width) - 1) * imageAspectRatio * scale;
公式推导

代码
void Renderer::Render(const Scene& scene)

void Renderer::Render(const Scene& scene)
{
   
    std::vector<Vector3f> framebuffer(scene.width * scene.height);

    float scale = std::tan(deg2rad(scene.fov * 0.5f));
    float imageAspectRatio = scene
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值