1. 程式人生 > >【Ray Tracing in One Weekend】(ch0~1)c++生成的第一張圖片

【Ray Tracing in One Weekend】(ch0~1)c++生成的第一張圖片

Chapter 0: Overview

作者講了講自己的教學經驗以及有關光線追蹤的一些事。

作者推薦我們使用c++。

Chapter 1: Output an image

展示瞭如何用程式碼生成第一張圖片。用到了PPM格式。

這裡寫圖片描述

這裡 有PPM格式的詳解。

書中例項程式碼如下(添加了輸出到 txt 檔案的程式碼,原始碼只輸出到命令列):

#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; }

輸出結果如下,拷貝 firstImage.txt 並修改後綴為 .ppm。
這裡寫圖片描述

使用 Photoshop CC 2017 開啟後,如圖所示:

這裡寫圖片描述

從如下三行程式碼中我們可以看到:

float r = float(i) / float(nx);
float g = float(j) / float(ny);
float b = 0.2f;

在RGB三色通道中,從上到下,綠色通道值減小;從左到右,紅色通道值增加;而藍色通道值不變。所得圖片即上圖。

我們可以在 Photoshop 中驗證一下:
把藍色通道值,即 B 固定為51,我們發現左邊的拾色盤跟我們的圖片一模一樣。從上到下,G 值減小;從左到右,R 值增加。右上角為黃色(255,255,51)。

這裡寫圖片描述

那如果我們想得到如下圖中拾色盤中的圖片,該怎麼做呢?

這裡寫圖片描述

觀察得,R 值固定為100,從左到右 B 值增加,從上到下,G 值減小。則修改程式碼為:

float g = float(j) / float(ny);
float b = float(i) / float(nx);

int ir = 100;
int ig = int(255.99f*g);
int ib = int(255.99f*b);

所得圖片如下:

這裡寫圖片描述