首页 > 其他分享 >reproduce-ray-tracing-in-one-weekend

reproduce-ray-tracing-in-one-weekend

时间:2023-12-26 09:57:15浏览次数:36  
标签:舍入 hit color tracing reproduce vec3 double weekend ray

reproduce-ray-tracing-in-one-weekend

Created: 2023-12-24T22:08+08:00
Published: 2023-12-26T09:38+08:00
Categories: ComputerGraphics

成像模型:

img

  • vec3, ray

  • image 和 viewport 大小

  • 几何约定,up-y,right-x, back-z

  • camera 和 viewport 中的各个点和向量

    • viewport 边向量
    • 单位 pixel 边向量
    • camera 位置
  • 球体求交:符合条件的 \(t>0\)。

    \[\begin{align*} & \text{ray: } A + tB \\ & \text{sphere: } (P-C) \cdot (P- C) = r^2 \\ & \text{inter: } (A + tB - C) \cdot (A + t B - C) = r^2 \end{align*} \]

    trick: half_b

  • hit_recordhittablesphere 类,bool hit(ray, tmin, tmax, hit_rec)

    • 决定 front 或者 back face,让 normal 永远 against ray
    • object 的 normal 和 hit_record 的 normal 不必相同,通过 bool front 区分是内部打到还是外部打到
  • hittable_list,并实现 hit 方法

  • main.cpp 中添加 hittable_list world

  • interval.h 用其改写所有的 hit()

    • surrounds(), contains()
    • static const empty, universe
  • 使用 random 对每个 pixel multi-sample 来抗锯齿

  • ray_color() 中使用 random-hemisphere 添加 diffuse 反射(反射向量随机),递归调用 hit

    • 递归的 bug 是反射线的 origin 可能位于表面以下,所以 interval.min = 0.001
    • 最关键的代码:
    if (world.hit(r, interval(0.001, infinity), rec)) {
        color  attenuation;
        ray scattered;
        if (rec.mat->scatter(r, rec, attenuation, scattered)) {
            return attenuation * ray_color(scattered, depth - 1, world);
        }
        else {
            return color(0, 0, 0);
        }
    }
    
  • gamma correction: 线性空间到 gamma 空间,0-1 的值要变大

  • material:如何表示一次反射 scatter(ray_in, hit_rec, attenuation, ray_out)

    • 如何理解颜色?我们看到的颜色不是物体的固有属性,教程中给出的物体的固有属性叫做 \(albedo\)(反照率)和 \(attenuation\)(衰减)
      光(rgb)打到物体上,乘上物体的反照率然后衰减。比如不是特别亮的光 (.8,.8,.8) 达到折射率为 (.5,.5,.5),出来的颜色就是 (.4,.4,.4)
      除此以外还要计算反射光的方向,漫反射可以随机,镜面反射就是反射,电介质需要 Snell's Law 决定是否全反射
    • Lambertian: 小心 Lambertian 反射导致的 zero vector
    • mirror 和 dielectric
  • camera defocus

code: rfhits/reproduce-raytrace-in-one-weekend: reproduce raytrace in one weekend

目录

vec3.xyz

使用 union 更加方便:

class vec3
{
public:
    union {
        struct {
            double x;
            double y;
            double z;
        };
        double e[3];
    };
    vec3() :e{ 0,0,0 } {}
    vec3(double x, double y, double z) : e{ x, y, z } {};
}

255.999

color.h 中使用 255.999 的可能原因:

在给定的代码中,为了将颜色分量的浮点值转换为在 [0, 255] 范围内的整数值,使用了 static_cast<int>(255.999 * pixel_color.x()) 的形式。
这种做法是为了防止舍入误差。由于浮点数表示的有限精度,乘以 255 可能会导致舍入到较低的整数值,例如 254.9999 可能会舍入为 254。为了避免这种情况,我们可以使用 255.999 来确保浮点数在乘以 255 后能够正确舍入到最接近的整数值。
例如,假设 pixel_color.x() 的值为 1.0,直接乘以 255 将得到 254.9999,舍入为 254。而使用 255.999 * pixel_color.x() 将得到 255.999,舍入为 255。
这样做可以确保最终计算得到的整数值在 [0, 255] 范围内,以便正确地表示颜色分量。
-- poe

标签:舍入,hit,color,tracing,reproduce,vec3,double,weekend,ray
From: https://www.cnblogs.com/ticlab/p/17927450.html

相关文章

  • odigos 基于ebpf 以及OpenTelemetry 的分布式tracing 解决方案
    按照odigos官方的介绍是不需要进行代码的修改就可以实现方便的跨应用的分布式trace,目前支持java,python,net,go,js等语言目前看官方的介绍,安装是比较简单的(核心基于了k8s),目前官方文档比较清晰可以试用下说明目前开源分布式trace的工具是越来越多了,同时基于ebpf以及OpenTelemetry标......
  • 【图形学笔记】Lecture12-Path Tracing-路径追踪
    Lecture12-PathTracing-路径追踪目录Lecture12-PathTracing-路径追踪RayCasting光线追踪Ray-surfaceintersection射线-表面判交光线和平面光线和三角形判交——MöllerTrumbore算法RayIntersectionWithSphereRayIntersectionWithImplicitSurfaceBoundingVolumes......
  • odigos 基于ebpf 以及OpenTelemetry 的分布式tracing 解决方案
    按照odigos官方的介绍是不需要进行代码的修改就可以实现方便的跨应用的分布式trace,目前支持java,python,net,go,js等语言目前看官方的介绍,安装是比较简单的(核心基于了k8s),目前官方文档比较清晰可以试用下说明目前开源分布式trace的工具是越来越多了,同时基于ebpf以及OpenTelemetry......
  • 当我们谈Raytracing时我们在谈些什么
    【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!科普性的介绍一下光追。不讲蒙特卡洛和分层抖动采样,不讲PBRT,不讲BRDF,不讲渲染方程,降噪方法,不讲SDF的细节概念。简而言之,复杂的一概不讲,麻绳专挑细处断......
  • Rust 日志记录库 tracing
    Rust日志记录库tracing​#2023-09-26#​#日志#​#tracing#一个好用的日志跟踪系统,可以帮助我们很快的定位程序中的bug。tracing不仅仅可以作为一个日志库去使用,还可以作为一个程序追踪库,帮助我们分析程序中存在的问题。tracing-Rusttracing各个模块​tracing​​:......
  • 10.Ray Tracing(Whitted-Style)
    光栅化的局限性软阴影实现效果不好尤其是当光线不止一次反射时光线追踪研究前提研究光线追踪的假设前提:光线是沿着直线传播的光线与光线之间是不发生碰撞光线的可逆性。比如一条光线是从光源到物体再反射到眼睛中去,也可以说是从眼睛发出一条光线到物体表面再反射到光源......
  • 进阶篇丨链路追踪(Tracing)很简单:链路成本指南
    广义上的链路成本,既包含使用链路追踪产生的数据生成、采集、计算、存储、查询等额外资源开销,也包含链路系统接入、变更、维护、协作等人力运维成本。为了便于理解,本小节将聚焦在狭义上的链路追踪机器资源成本,人力成本将在下一小节(效率)进行介绍。链路追踪机器成本的组成结构链路追踪......
  • 进阶篇丨链路追踪(Tracing)很简单:常见问题排查
    作者:涯海经过前面多篇内容的学习,想必大部分同学都已经熟练掌握分布式链路追踪的基础用法,比如回溯链路请求轨迹,定位耗时瓶颈点;配置核心接口黄金三指标告警,第一时间发现流量异常;大促前梳理应用上下游关键依赖,联系相关方协同备战等等。随着深入使用链路追踪技术,问题发现与诊断方面的......
  • 使用篇丨链路追踪(Tracing)很简单:链路拓扑
    作者:涯海最近一年,小玉所在的业务部门发起了轰轰烈烈的微服务化运动,大量业务中台应用被拆分成更细粒度的微服务应用。为了迎接即将到来的双十一大促重保活动,小玉的主管让她在一周内梳理出订单中心的全局关键上下游依赖,提前拉通各方对齐重保方案。这个任务可愁坏了小玉,平时她只与直......
  • 使用篇丨链路追踪(Tracing)很简单:链路拓扑
    作者:涯海最近一年,小玉所在的业务部门发起了轰轰烈烈的微服务化运动,大量业务中台应用被拆分成更细粒度的微服务应用。为了迎接即将到来的双十一大促重保活动,小玉的主管让她在一周内梳理出订单中心的全局关键上下游依赖,提前拉通各方对齐重保方案。这个任务可愁坏了小玉,平时她只与直接......