【Ray Tracing in One Weekend】(ch9)Dielectrics

来源:互联网 发布:股市和楼市的关系 知乎 编辑:程序博客网 时间:2024/05/28 18:45

Chapter 9: Dielectrics

这章是关于折射的,看不太懂,这里转一篇别人的技术文章,讲的很好:

http://blog.csdn.net/libing_zeng/article/details/72599121

我在这就贴贴代码和图片吧。

首先是在 Material.h 中,新添如下代码:

float Schlick(float cosine, float ref_idx) {    float r0 = (1 - ref_idx) / (1 + ref_idx);    r0 = r0*r0;    return r0 + (1 - r0)*pow((1 - cosine), 5);}//计算折射光线的方向向量。ni_over_nt 为入射介质的折射指数和折射介质的折射指数的比值。bool Refract(const Vec3& v, const Vec3& n, float ni_over_nt, Vec3& refracted) {    Vec3 uv = unit_vector(v);    float dt = dot(uv, n);    float discriminant = 1.0 - ni_over_nt*ni_over_nt*(1 - dt*dt);    if (discriminant > 0) {        refracted = ni_over_nt*(uv - n*dt) - n*sqrt(discriminant);        return true;    }    //根号里面的内容小于零,说明折射光线的方向向量无实根,即没有折射光线,即出现全反射。所以,折射光线函数return false    else        return false;}class Dielectric : public Material {public:    Dielectric(float ri) : ref_idx(ri) {}    virtual bool Scatter(const Ray& r_in, const hit_record& rec, Vec3& attenuation, Ray& scattered) const {        Vec3 outward_normal;        Vec3 reflected = Reflect(r_in.direction(), rec.normal);        float ni_over_nt;        attenuation = Vec3(1.0, 1.0, 1.0);        Vec3 refracted;        float reflect_prob;        float cosine;        if (dot(r_in.direction(), rec.normal) > 0) {            outward_normal = -rec.normal;            ni_over_nt = ref_idx;            //cosine = ref_idx * dot(r_in.direction(), rec.normal) / r_in.direction().length();            cosine = dot(r_in.direction(), rec.normal) / r_in.direction().length();            cosine = sqrt(1 - ref_idx*ref_idx*(1 - cosine*cosine));        }        else {            outward_normal = rec.normal;            ni_over_nt = 1.0 / ref_idx;            cosine = -dot(r_in.direction(), rec.normal) / r_in.direction().length();        }        if (Refract(r_in.direction(), outward_normal, ni_over_nt, refracted))            reflect_prob = Schlick(cosine, ref_idx);        else            reflect_prob = 1.0;        if ((rand() % (100) / (float)(100)) < reflect_prob)            scattered = Ray(rec.p, reflected);        else            scattered = Ray(rec.p, refracted);        return true;    }    float ref_idx;};

Main方法中代码修改如下:

    Hitable *list[5];    list[0] = new Sphere(Vec3(0.0f, 0.0f, -1.0f), 0.5f, new Lambertian(Vec3(0.8f, 0.3f, 0.3f)));    list[1] = new Sphere(Vec3(0.0f, -100.5f, -1.0f), 100.0f, new Lambertian(Vec3(0.8f, 0.8f, 0.0f)));    list[2] = new Sphere(Vec3(1.0f, 0.0f, -1.0f), 0.5f, new Metal(Vec3(0.8f, 0.6f, 0.2f),0.3f));    list[3] = new Sphere(Vec3(-1.0f, 0.0f, -1.0f), 0.5f, new Dielectric(1.5f));    list[4] = new Sphere(Vec3(-1.0f, 0.0f, -1.0f), -0.45f, new Dielectric(1.5f));    Hitable *world = new HitableList(list, 5);

所得如图:

这里写图片描述

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 烟台p2p 烟台介绍 烟台400 烟台mba 烟台 华怡 烟台电话 石家庄烟台 烟台玻璃门 烟台到台北 烟台刘福生 烟台市区 烟台万振涛 中国烟台 烟台旅游景点 烟台南山学院 烟台职业学院 烟台大学文经学院 烟台旅游攻略 山东烟台旅游 烟台马家沟景区 烟台文经学院 烟台热气球事故 烟台市人力资源和社会保障局 烟台马家沟气球 烟台房地产网二手房 烟台房产网在售楼盘 烟台房产信息网 烟台房产交易中心 烟台搜房网二手房 烟台房产网二手房 烟台房产交易信息网 烟台房地产交易网 烟台房地产信息网 烟台房产交易网 烟台到上海机票 烟台富士康怎么样 烟台大学是几本 烟台大学图片 烟台是哪个省 烟台论坛首页 烟台旅游景点大全排名榜