Ray tracking in One Weekend

本文是关于在一周内学习光线追踪的教程,从输出图片开始,讲解了PPM文件格式,包括ASCII和Binary编码的区别。接着介绍了向量类`vec3`的实现。然后介绍了光线、简单相机和背景的创建,以及如何通过光线追踪计算颜色。第四章增加了球体,讨论了如何判断光线与球体的交点。最后,第五章涉及表面法线和处理多个物体,通过法向量实现颜色变化。
摘要由CSDN通过智能技术生成

目录

Chapter 0: Overview

Chapter 1: Output an image

Chapter 2: The vec3 class

Chapter 3: Rays, a simple camera, and background

Chapter 4: Adding a sphere

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

http://netpbm.sourceforge.net/doc/ppm.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三色通

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值