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

来源:互联网 发布:绿色傲剑八卦升级数据 编辑:程序博客网 时间:2024/06/09 03:42

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;}


4 0
原创粉丝点击