【Ray Tracing The Next Week 超详解】 光线追踪2-5
Chapter 5:Image Texture Mapping
先看效果:
我们之前的纹理是利用的是撞击点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_tex.hpp // -----------------------------------------------------
// [author] lv
// [begin ] 2019.1
// [brief ] the image_texture-class for the ray-tracing project
// from the 《ray tracing the next week》
// ----------------------------------------------------- #pragma once namespace rt
{
class image_texture: public texture
{
public:
image_texture() { } image_texture(unsigned char* image, size_t a, size_t b); inline unsigned char* image()const { return _image; } inline size_t sizeX()const { return _sizeX; } inline size_t sizeY()const { return _sizeY; } public:
virtual rtvec value(rtvar u, rtvar v, const rtvec& p)const override; private:
unsigned char* _image; size_t _sizeX; size_t _sizeY;
}; image_texture::image_texture(unsigned char* image, size_t a, size_t b)
:_image(image)
,_sizeX(a)
,_sizeY(b)
{
} rtvec image_texture::value(rtvar u, rtvar v, const rtvec& p)const
{
int i = u*_sizeX;
int j = ( - v)*_sizeY - 0.001;
if (i < )i = ;
if (j < )j = ;
if (i > _sizeX - )i = _sizeX - ;
if (j > _sizeY - )j = _sizeY - ;
rtvar r = int(_image[ * i + * _sizeX*j]) / 255.0;
rtvar g = int(_image[ * i + * _sizeX*j + ]) / 255.0;
rtvar b = int(_image[ * i + * _sizeX*j + ]) / 255.0;
return rtvec(r, g, b);
} }
image_texture.hpp
因为图片信息是有一维数组存储的,每个元素的rgb是顺序存储的,所以每个像素点有三个值,所以求取对应位置索引的时候要用3乘
现在我们需要的是读取并存储图像文件
我们采用stb图片读取处理库,我们就用一个函数
我们要在库引用之前先定义一个宏
#define STB_IMAGE_IMPLEMENTATION
然后#include “stb_image.h”
如果你们找不到地球图,就去我相册中下载一下吧
或者随便找一个也行
然后就可以得到第一张图
第二章图的话,就是下面那个是金属材质的球,可以采用下面函数
如果有什么代码不完整的可以在下面留言
我们的代码,一般情况下会在每本书的后面做统一的整理公布
感谢您的阅读,生活愉快~
【Ray Tracing The Next Week 超详解】 光线追踪2-5的更多相关文章
- 【Ray Tracing The Next Week 超详解】 光线追踪2-9
我们来整理一下项目的代码 目录 ----include --hit --texture --material ----RTdef.hpp ----ray.hpp ----camera.hpp ---- ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-6 Cornell box
Chapter 6:Rectangles and Lights 今天,我们来学习长方形区域光照 先看效果 light 首先我们需要设计一个发光的材质 /// light.hpp // ------- ...
- 【Ray Tracing in One Weekend 超详解】 光线追踪1-4
我们上一篇写了Chapter5 的第一个部分表面法线,那么我们来学剩下的部分,以及Chapter6. Chapter5:Surface normals and multiple objects. 我们 ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-7 任意长方体 && 场景案例
上一篇比较简单,很久才发是因为做了一些好玩的场景,后来发现这一章是专门写场景例子的,所以就安排到了这一篇 Preface 这一篇要介绍的内容有: 1. 自己做的光照例子 2. Cornell box画 ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-8 Volume
Preface 今天有两个东东,一个是体积烟雾,一个是封面图 下一篇我们总结项目代码 Chapter 8:Volumes 我们需要为我们的光线追踪器添加新的物体——烟.雾,也称为participat ...
- 【Ray Tracing in One Weekend 超详解】 光线追踪1-8 自定义相机设计
今天,我们来学习如何设计自定义位置的相机 ready 我们只需要了解我们之前的坐标体系,或者说是相机位置 先看效果 Chapter10:Positionable camera 这一章我们直接用概念 ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-4 Perlin noise
Preface 为了得到更好的纹理,很多人采用各种形式的柏林噪声(该命名来自于发明人 Ken Perlin) 柏林噪声是一种比较模糊的白噪声的东西:(引用书中一张图) 柏林噪声是用来生成一些看似杂乱 ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-3
Preface 终于到了激动人心的纹理章节了 然鹅,看了下,并不激动 因为我们之前就接触过 当初有一个 attenuation 吗? 对了,这就是我们的rgb分量过滤器,我们画出的红色.蓝色.绿色等 ...
- 【Ray Tracing The Next Week 超详解】 光线追踪2-2
Chapter 2:Bounding Volume Hierarchies 今天我们来讲层次包围盒,乍一看比较难,篇幅也多,但是咱们一步一步来,相信大家应该都能听懂 BVH 和 Perlin text ...
随机推荐
- Linux查找文件、文件夹
https://www.jianshu.com/p/f3a46e5c96ba 查找目录:find /(查找范围) -name '查找关键字' -type d 查找文件:find /(查找范围) -na ...
- Reverse Words in a String I & Reverse Words in a String II
Reverse Words in a String I Given an input string, reverse the string word by word. For example,Give ...
- [转]解决win7 64位操作系统下安装PL/SQL后连接报错问题: make sure you have the 32 bits oracle client installed
1. 在Oracle官网(http://www.oracle.com/technetwork/topics/winsoft-085727.html)下载文件: instantclient-basic- ...
- openstack常见问题解决方法总结
一.创建实例失败: 首先用下面命令查看服务是否正常 1. nova-manage service list 如果不正常,则使用下面命令重启,如果还不行,则查看日志, 1. service nova-a ...
- adb启动和停止android app方法
一.启动app adb shell am start 包名/MainActivity 上面涉及到的包名及mainactivity获取办法 方法一: 1.adb shell 2.dumpsys act ...
- client模式下对应接口加入桥接出错
client模式下,响应的接口wlan0 加入桥接时出现如下错误: root@root:~# brctl addif br-lan wlan0brctl: bridge br-lan: Operati ...
- ZOJ 2314 Reactor Cooling(无源汇有上下界可行流)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 题目大意: 给n个点,及m根pipe,每根pipe用来流躺 ...
- python+selenium五:多窗口切换与获取句柄
from selenium import webdriverfrom selenium.webdriver.common.by import Byimport time driver = webdri ...
- linux + docker + selenium grid 实现分布式执行selenium脚本
Selenium Grid 有两个概念 hub :主节点,你可以看作 "北京总公司的测试经理". node:分支节点,你可以看作 "北京总公司的测试小兵A" 和 ...
- swich使用
package demo; import java.util.Scanner; /** * swich(变量){//byte\shore\char\int'枚举(jdk1.5)/String(1.7) ...