目录
Chapter 3: Rays, a simple camera, and background
Chapter 5: Surface normals and multiple object
Chapter 0: Overview
主要讲了作者的教学经验以及Ray track的看法
作者推荐我们使用C++来完成这本书的编码实践
另外作者还附上了他的GitHub库 https://github.com/petershirley/raytracinginoneweekend
Chapter 1: Output an image
当你开始做渲染时,你得先知道你要如何查看图片(Image)。最直接的方式就是写一个文件来输出图片。这个章节就在告诉读者如何用代码生成一张图片,图片的格式(format)用到的是PPM文件格式。
About PPM file(关于PPM文件格式)
PPM(Portable Pixmap Format)图像格式是由Jef Poskanzer 在1991年所创造。创造之初就希望对于格式尽量的简单。
PPM and「PBM」and「PGM」三者之间的区别:
- PBM 是位图(Bitmap),仅有黑与白,没有灰
- PGM 是灰度图(Grayscale)
- PPM 是通过RGB三种颜色显现的图像(Pixmaps)
每个图像文件的开头都通过2个字节「magic number」来表明文件格式的类型(PBM, PGM, PPM),以及编码方式(ASCII 或 Binary),这就意味着对于PBM和PGM和PPM都有两个版本,一种使用ACSII编写的版本,另一个使用binary格式编写的版本。[magic number]分别为P1、P2、P3、P4、P5、P6。
Magic Number Type Encoding P1 Bitmap ASCII P2 Grayscale ASCII P3 Pixmap ASCII P4 Bitmap Binary P5 Grayscale Binary P6 Pixmap Binary 编码方式:
- ASCII编码格式适合人类阅读理解,可以用文本编辑器打开,读取对应图像的数据(比如PPM格式的RGB值)。
- Binary格式适合机器阅读,按照二进制形式,顺序存储图像信息,不用空格分隔,所以图像处理起来更有效率,占用空间容量更少(由于缺少空格)。
What is PPM format?(PPM格式详解)
A PPM header consists of the following entries, each separated by white space:
Magic Number Literally P3 for ASCII version, P6 for binary version ImageWidth Width of image in pixels (ASCII decimal value) ImageHeight Height of image in pixels (ASCII decimal value) MaxGrey Maximum color value (ASCII decimal value) PPM图像格式分为两部分,分别为头部分和图像数据部分。
头部分:由4部分组成,通过换行或空格对这4部分进行分割,在PPM标准中要求使用空格。头部分的意义在于提供了对于图像内容的整体概括描述。在头部可以用#来表示注释
- 第1部分 version:P3或P6,指明PPM的编码(ASCII or binary)格式,
- 第2部分 Width:图像的宽度
- 第3部分 Heigh:高度,通过ASCII表示,
- 第4部分 Maximum:最大像素值,0-255字节表示。
图像部分:图像部分紧挨着头部,用一系列的RGB值对图像进行描述。
- 对于ASCII格式,就是按照RGB的顺序排列,以ASCII存储,并且,RGB中间用空格隔开,图片每一行用回车隔开。
- 对于binary格式,就是每一个像素点的RGB值分别顺序存储并且按二进制写入文件(fwrite),没有任何分隔。
对于PPM格式,每个像素由3个十进制ACII码组成RGB定义色彩块。而ASCII码的取值范围是在(0,Maximum)从0到定义的颜色最大值。值得注意的是,每个RGB值都需要用空格来进行分隔。
Eg:
P3 3 2 255 255 000 000 000 255 000 000 000 255 255 255 000 255 255 255 000 000 000
-P3: PPM编码格式为ASCII
-3: 3列像素
-2: 2行像素
-255: 最大像素值
How to view the PPM file?(如何查看PPM文件)
Xnview、PhotoShop等都可以支持查看PPM文件
参考:http://www.fileformat.info/format/pbm/egff.htm
https://www.cs.swarthmore.edu/~soni/cs35/f13/Labs/extras/01/ppm_info.html
Let’s make some C++ code to output such a thing:
对PPM文件有了一定的了解之后,我们开始用书中的例子开始用C++输出一段代码表示PPM文件来展示一张图片。
(书中的例子是在命令行中输出源代码结果,这样会导致我们不方便保存代码结果。我在这里用IO流将结果代码存到一个txt文件中,然后将txt文件的格式改为ppm。)
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ofstream outfile;
outfile.open("firstImage.txt");
int nx = 200;
int ny = 100;
outfile << "P3\n" << nx << " " << ny << "\n255\n";
for (int j = ny - 1; j >= 0; j--)
{
for (int i = 0; i < nx; i++)
{
float r = float(i) / float(nx);
float g = float(j) / float(ny);
float b = 0.2f;
int ir = int(255.99f*r);
int ig = int(255.99f*g);
int ib = int(255.99f*b);
outfile << ir << " " << ig << " " << ib << "\n";
}
}
outfile.close();
return 0;
}
结果如下:
实现了图形学中的“Hello World”之后,我们来分析输出的PPM文件以及代码是如何得到这样的色彩变化的图片。
在代码中我们可以看到这样一段代码
float r = float(i) / float(nx);
float g = float(j) / float(ny);
float b = 0.2f;
在RGB三色通