问题三十六:ray tracing中的Inverse Mapping(0)——概要

198 篇文章 12 订阅
195 篇文章 27 订阅

Inverse Mapping指的是某点在某面的相对位置,这个“相对位置”用u、v表示。 Inverse Mapping完成后,相当于将某面映射到了uv平面,u、v的取值范围为[0, 1]。

 

这一章节会讲到球面、凸四边形(含三角形)、圆、圆柱面、圆锥面五类面的Inverse Mapping。












为了对比各种面的Inverse Mapping效果,我们用同一个uv平面:


也就是说,以上提到的五类曲面(平面)影射后的uv平面的图都是这一张。那么,问题来了,对于这五类曲面(平面)本身应该分别是什么样子呢(才能最终都映射成这么一样图)?这一章节,就是解决这么个问题。

 

首先,我们现在在lambertian.cpp中对uv平面这张图描述一下(对应八个色块):

----------------------------------------------lambertian.cpp ------------------------------------------

lambertian.cpp

 

vec3 get_albedo(float u, float v) {

    if ((v >= 0) && (v < 0.5)) {
        if ((u >= 0) && (u < 0.25)) {
            return vec3(0, 0, 0);//黑色块
        }
        else if ((u >= 0.25) && (u < 0.5)) {
            return vec3(0, 0, 1);//蓝色块
        }
        else if ((u >= 0.5) && (u < 0.75)) {
            return vec3(0, 1, 0); //绿色块
        }
        else {
            return vec3(0, 1, 1); //浅蓝色块
        }
    }
    else if ((v >= 0.5) && (v <= 1.0)) {
        if ((u >= 0) && (u < 0.25)) {
            return vec3(1, 0, 0);//红色块
        }
        else if ((u >= 0.25) && (u < 0.5)) {
            return vec3(1, 0, 1);//紫色块
        }
        else if ((u >= 0.5) && (u < 0.75)) {
            return vec3(1, 1, 0);//黄色块
        }
        else if ((u >= 0.75) && (u <= 1.0)) {
            return vec3(1, 1, 1);//浅紫色块
        }
    }
}

// lambertian::scatter也配合改动一下
bool lambertian::scatter(const ray& r_in, const hit_record& rec, vec3& attenuation, ray& scattered) const {
//    std::cout << "-------------lambertian::scatter----------------" << endl;
    vec3 target = rec.p + rec.normal + random_in_unit_sphere();
    scattered = ray(rec.p, target-rec.p);
if ((rec.u >= 0.0) && (rec.u <= 1.0) && (rec.v >= 0.0) && (rec.v <= 1.0)) {
//映射后的u、v在[0, 1],在物体的hit()会对u、v进行赋值;如果不做映射,则u、v设置为-1,在这里,attenuation还是返回原来的albedo。
        attenuation = get_albedo(rec.u, rec.v);
    }
    else {
        attenuation = albedo;
    }
    return true;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值