首页 > 其他分享 >0199-漫反射和伽马校正

0199-漫反射和伽马校正

时间:2024-07-19 14:42:06浏览次数:16  
标签:漫反射 1.0 0.0 0199 let new 伽马 f64 ray

环境

  • Time 2022-11-16
  • WSL-Ubuntu 22.04
  • Rust 1.65.0

前言

说明

参考:https://raytracing.github.io/books/RayTracingInOneWeekend.html

目标

对物体上的光线进行漫反射,然后增加伽马校正。

颜色显示函数

pub fn format_str(&self, samples: f64) -> String {
    let ir = (256.0 * (self.x / samples).sqrt().clamp(0.0, 0.999)) as u64;
    let ig = (256.0 * (self.y / samples).sqrt().clamp(0.0, 0.999)) as u64;
    let ib = (256.0 * (self.z / samples).sqrt().clamp(0.0, 0.999)) as u64;

    format!("{ir} {ig} {ib}\n")
}

支持加等操作

// 向量的加法
impl AddAssign for Vector3 {
    fn add_assign(&mut self, rhs: Self) {
        *self = self.add(rhs)
    }
}

在单位小球里的点

pub fn random_in_unit() -> Self {
    loop {
        let mut rand = rand::thread_rng();

        let vector3 = Vector3 {
            x: rand.gen_range(-1.0..1.0),
            y: rand.gen_range(-1.0..1.0),
            z: rand.gen_range(-1.0..1.0),
        };

        if vector3.length() < 1.0 {
            return vector3;
        }
    }
}

main.rs

use camera::Camera;
use hittable::{Hit, World};
use rand::Rng;
use ray::Ray;
use sphere::Sphere;
use vector3::{Color, Point3, Vector3};

mod camera;
mod hittable;
mod ray;
mod sphere;
mod vector3;

fn main() {
    // 图片的比例,和宽高
    const WIDTH: u64 = 400;
    const HEIGHT: u64 = (WIDTH as f64 / camera::RATIO) as u64;
    const SAMPLES_PER_PIXEL: u64 = 100;
    const MAX_DEPTH: u64 = 5;

    // 相机
    let camera = Camera::new();

    // 输出图片,第一行输出 P3,表示像素图
    let mut content = String::from("P3");
    // 输出宽和高,和最大颜色值
    content.push_str(&format!("\n{WIDTH} {HEIGHT}\n255\n"));

    let world: World = vec![
        Box::new(Sphere::new(Point3::new(0.0, 0.0, -1.0), 0.5)),
        Box::new(Sphere::new(Point3::new(0.0, -100.5, -1.0), 100.0)),
    ];

    let mut rng = rand::thread_rng();
    for j in (0..HEIGHT).rev() {
        // 进度
        eprintln!("Scan lines remaining: {j}");
        for i in 0..WIDTH {
            let mut color = Color::default();
            for _ in 0..SAMPLES_PER_PIXEL {
                let random_u: f64 = rng.gen();
                let random_v: f64 = rng.gen();

                let u = ((i as f64) + random_u) / ((WIDTH - 1) as f64);
                let v = ((j as f64) + random_v) / ((HEIGHT - 1) as f64);

                color += ray_color(&camera.get_ray(u, v), &world, MAX_DEPTH);
            }
            content.push_str(&color.format_str(SAMPLES_PER_PIXEL as f64));
        }
    }
    println!("{}", content);
    eprintln!("Done.");
}

// 光线的颜色计算
fn ray_color(ray: &Ray, hittable: &dyn Hit, depth: u64) -> Color {
    // 超过最大深度,直接变成黑色
    if depth == 0 {
        return Color::new(0.0, 0.0, 0.0);
    }

    if let Some(record) = hittable.hit(ray, 0.0, f64::INFINITY) {
        let target = record.point + record.normal + Vector3::random_in_unit();
        let ray = Ray::new(record.point, target - record.point);
        return 0.5 * ray_color(&ray, hittable, depth - 1);
    }

    // 射线的单位向量
    let unit = ray.direction().unit();
    // 因为需要得到上下渐变的背景图,所以需要对 y 进行插值。
    let t = 0.5 * (unit.y + 1.0);
    // 线性插值,根据不同的光线得到在下面这个范围里的不同的颜色,并且是渐变色。
    (1.0 - t) * Color::new(1.0, 1.0, 1.0) + t * Color::new(0.5, 0.7, 1.0)
}

效果

漫反射

总结

给图片增加漫反射的功能。

附录

标签:漫反射,1.0,0.0,0199,let,new,伽马,f64,ray
From: https://www.cnblogs.com/jiangbo4444/p/18311416

相关文章

  • RK3588-12将亮度调节从伽马曲线改调节为线性调节
    需求:    Rockchip-android11和android12系统亮度调节框调节亮度是曲线调节,需改为像低版本系统一样的线性调节效果(亮度递增效果)解决方法:代码路径:frameworks/base/packages/SettingsLib/src/com/android/settingslib/display/BrightnessUtils.java---a/pack......
  • 10199元起 LG gram Pro 2024款笔记本上架:酷睿Ultra 7+120Hz OLED屏
    LGgramPro2024款笔记本目前已经上架,首发10199元起。设计上,新款笔记本的重量只有1199克,厚度仅为12.4毫米,轻薄机身可以轻松放入日常背包。据悉,新款笔记本提供了16英寸(16Z90SP)和17英寸(17Z90SP)版本,采用2.8KOLED屏幕,支持120Hz超高刷新率。性能上,新款笔记本可选英特尔酷睿Ultra......
  • R语言非线性回归和广义线性模型:泊松回归、伽马回归、逻辑回归、Beta回归分析机动车事
    全文链接:https://tecdat.cn/?p=33781原文出处:拓端数据部落公众号我们使用广义线性模型(GeneralizedLinearModels,简称GLM)来研究客户的非正态数据,并探索非线性关系。GLM是一种灵活的统计模型,适用于各种数据类型和分布,包括二项分布、泊松分布和负二项分布等非正态分布。通过GLM,我......
  • 2.6 伽马校正 一、Gamma校正
    一、Gamma校正颜色空间通用:sRGB电影:DCI-P3电视:Rec-709、PAL等印刷:CMYK、AdobeRGB 传递函数我们知道了颜色的颜色值,要在电子设备上显示,就要把它转换为视频信号,传递函数就是用来做转换的。一个传递函数包括两部分:OETF:光转电传递函数,负责把场景线性光转到非线性视频信号值。EOTF:电转......
  • Unity之伽马空间与线性空间
    关于伽马空间与线性空间,可参考:https://zhuanlan.zhihu.com/p/432224776https://blog.csdn.net/sinat_34014668/article/details/128604170https://blog.csdn.net/zhjzhjxzhl/article/details/119917984https://zhuanlan.zhihu.com/p/432846112总结如下:1)PS输出的是sRGB贴图(G......
  • JavaScript 实现伽马算法
    伽马函数是数学中的一个非常重要的函数,它在统计学、物理学等领域有广泛的应用,其中最重要的应用就在概率统计和计算机科学中。接下来,我们来介绍如何使用JavaScript实现伽马算法。递归实现functiongamma(x){if(x===1){return1;}else{return(x-1)......
  • 伽马校正
    颜色空间​ 在介绍伽马校正前,我们先了解了解必要的知识——颜色空间​ 颜色空间有几种,分别是sRGB、CIEXYZ等,他们都有颜色匹配函数,但不同颜色空间表示的色域范围不同CIEXYZ​ CIEXYZ是人造的颜色空间,他并不是由实验得出的,用XYZ表示颜色,其中Y可以表示亮度​ CIEXYZ的颜色......
  • Shader入门精要笔记 - CH7.3_渐变图控制漫反射
    左边是使用了前面提到的SpecularPerPixel,中间是没加渐变图时,右边是加了渐变图 高光+渐变图漫反射(RampTex)Shader"My/Tex/RampTexture"{Properties{......
  • 《UnityShader入门精要》 漫反射部分代码及详细注释
    漫反射漫反射计算公式:Cdiffuse=(Clight·Mdiffuse)max(0,n·l)Clight:入射光线的强度和颜色Mdiffuse:材质的漫反射系数物体本色n:法线单位向量l:......
  • 17、OpenCV灰度翻转\增强\压缩\伽马变化
    基本思想:基本原理参考OpenCV手册,此处只记录一下如何使用;#include<opencv2/opencv.hpp>#include<iostream>#include<vector>usingnamespacestd;usingnamespacecv;intma......