Ray Tracing in One Weekend を勉強しつつ、自作のレイトレをしてみたいなという記事です。
https://www.amazon.co.jp/Tracing-Weekend-Minibooks-Book-English-ebook/dp/B01B5AODD8
内容としては大体沿いつつ、実装自体は割と我流でやっていこうと思います。
使用言語はC++です。
Eigenのダウンロード
ベクトルや行列の計算が多々出てくるので、C++のヘッダであるEigenを利用します。
Eigenは高速ながらコンパイルがいらないので、パスを通すとか考えなくても使えるのが良いです。
こちらの公式サイトからダウンロード、回答したあとEigenフォルダをソースとおなじところに置きます。
これでincludeを叩くだけで行列やベクトルが扱えます。
画像の表示
ビットマップを扱うのは意外とヘッダの書き込みがあったりして面倒なので.pnm形式を利用します。pnm形式はめちゃくちゃ簡単で、
P3 //フルカラーの意味
512 512 //height, width
255 //RGBの最大値
R G B
R G B
R G B
・
・
・
RGBの配列をpnmファイルに書き出す関数を用意しました。
void write_ppm(vector<vector<vector<int>>> pic){
ofstream out;
out.open("test.pnm");
out << "P3" << endl;
out << pic.size() << " " << pic[0].size() << endl;
out << 255 << endl;
for (int i = 0 ; i < pic.size(); ++i){
for (int j = 0; j < pic[0].size(); ++j){
out << pic[i][j][0] << " " << pic[i][j][1] << " " << pic[i][j][2] << endl;
}
}
}
これだけです。簡単ですね。
この形式で書き込むだけで画像ファイルができます。ただこれを直接開けるエディタは限られているので、pngファイルとかに変換します。変換にはimagemagickを使用し
convert hoge.pnm -scale 512x512 hoge.png
のようにコマンドを叩くだけで変換してくれます。
第一回のソース
インクルードとか思いつく定数とかを定義したのが以下になります。
#include <bits/stdc++.h>
include "Eigen/Core"
using namespace std;
using namespace Eigen;
const double PI = 3.141592653589793238;
const double PI2 = 6.28318530718;
const double eps = 1e-6;
void write_ppm(vector<vector<vector<int>>> pic){
ofstream out;
out.open("test.pnm");
out << "P3" << endl;
out << pic.size() << " " << pic[0].size() << endl;
out << 255 << endl;
for (int i = 0 ; i < pic.size(); ++i){
for (int j = 0; j < pic[0].size(); ++j){
out << pic[i][j][0] << " " << pic[i][j][1] << " " << pic[i][j][2] << endl;
}
}
}
int main(void){
int height = 512;
int width = 512;
pic = vector<vector<vector<int>>>(height,vector<vector<int>>(width,vector<int>(3,150)));
write_ppm(pic);
return 0;
}