【Ray Tracing The Next Week 超详解】 光线追踪2-5

我们之前的纹理是利用的是撞击点p处的位置信息,比如大理石纹理 而我们今天的图片映射纹理采用2D(u,v)纹理坐标来进行。 在图像中使用缩放(u,v)的直接方法是将u和v四舍五入为整数,并将其作用于(i,j)像素。而,我们的纹理和物体的尺寸并不一致,所以我们需要将其规格化,然后再放大适应至物体尺寸。即,我们采用某个点在当前图像中的比例,而不是具体的位置,例如,对于nx乘ny图像中的像素(i,j),图像纹理位置为: u = i / (nx - 1) v = j / (ny - 1) 对于intersect,我们还需要在相交碰撞记录中返回u和v。对于球体,我们采用球面坐标。即: 如上坐标系采用光线追踪惯用坐标系,设P点为单位球上一点 ∠θ 为xOz平面与线段OP之间的夹角,θ∈0~π ∠φ 为线段OP在xOz平面的映射线与x轴正方向之间的夹角,φ∈0~2π 则: x = cosφ· cosθ z = sinφ· cosθ y = sinθ 将θ和φ规格化到【0,1】,则如下: u = φ/(2π) v = θ/π 过程: 我们先将撞击点的坐标映射到单位球面上(规格化),得到纹理坐标 然后材质纹理反射的时候将此规格化坐标带入 根据图片的规格展开得到图片对应的位置,返回图片对应处的rgb 可见,撞击点处应该存储关于图片纹理坐标的信息 所以,我们先将撞击点信息更新: 获取纹理坐标 反射求取图片对应出的像素值 我们来解决图片纹理对应的value函数 下面是图片纹理类 image_texture.hpp 因为图片信息是有一维数组存储的,每个元素的rgb是顺序存储的,所以每个像素点有三个值,所以求取对应位置索引的时候要用3乘 现在我们需要的是读取并存储图像文件 我们采用stb图片读取处理库,我们就用一个函数 我们要在库引用之前先定义一个宏 #define STB_IMAGE_IMPLEMENTATION 然后#include “stb_image.h” 如果你们找不到地球图,就去我相册中下载一下吧 或者随便找一个也行 然后就可以得到第一张图 第二章图的话,就是下面那个是金属材质的球,可以采用下面函数 如果有什么代码不完整的可以在下面留言 我们的代码,一般情况下会在每本书的后面做统一的整理公布 感谢您的阅读,生活愉快~ 作者:林-兮      出处:http://www.cnblogs.com/lv-anchoret/      本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 分类: 光线追踪 好文要顶 关注我 收藏该文 林-兮 关注 - 5 粉丝 - 3 +加关注 1 0 « 上一篇:【Ray Tracing The Next Week 超详解】 光线追踪2-4 Perlin noise posted @ 2019-01-20 15:46 林-兮 阅读(30) 评论(0) 编辑 收藏 https://www.cnblogs.com/lv-anchoret/p/10295137.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信