5·image Texture Mapping 图像纹理映射
我们之前虽然在交点信息新增了uv属性,但其实并没有使用,而是通过p交点笛卡尔坐标确定瓷砖纹理或者大理石噪声纹理的值
现在通过uv坐标读取图片,通过std_image库stbi_load(path)加载图片,返回图片指针,我们直接将std_image文件放在src源码中使用就行
我们创建image_texture的图片纹理,它的颜色值是通过uv坐标从data*纹理获取的,并且我们的球体应用这个新纹理
然后在求交时,不要忘记更新交点信息的uv坐标,通过函数:
void get_sphere_uv(const vec3& p, double& u, double& v) {/* 从p交点-》极坐标-》uv对应值 */
auto phi = atan2(p.z(), p.x());
auto theta = asin(p.y());
u = 1-(phi + pi) / (2*pi);
v = (theta + pi/2) / pi;
}
然后在ray_color()求得交点的uv后,应该调用value()获取uv对应的颜色,这里由于继承体系,我们将从材质获取纹理添加getTexture()的虚函数,以便动态的调用纹理的value()
下图是随意找的一张jpg格式的地球贴图
6·Rectangles and Lights 矩形和光源
我们想要在场景加入矩形的灯光,因此首先新建发光材质
接着为了让光源的效果更清晰,我们让背景不在是天空,改为全黑的,所有光都来自于我们的矩形光源
我们创建矩形物体,并重写hit求交函数,那么如何求交呢?
定义一个轴对齐xy方向的平面,x0,x1,y0,y1,z,首先射线方程仅看z值,求得t,然后再分别将t带入xy的射线方程,即可求出xy,那么当xy在范围内,那么就是相交的
现在开始布置Cornell Box场景
7·Cornell Box
创建新的box实例,因为要考虑倾斜角度,我们先把轴对齐box创建出来
实例:是一种经过旋转过或者平移等操作的几何图元。光线追踪中是通过改变光线来模拟物体操作的
对于平移:物体移动offset,相当于光线 - offset,因为光线实际没有移动,被修改的rec仍要改回来