简单的光线追踪教程(一)
1. 概述
最近闲来无事,想学习一下java,并且了解一下C++。网上搜索了很多得相关教程,学了一段时间之后发现,还是得自己亲自动手写一点东西。所以学了一点简单的光线追踪,与大家一起分享
里面涉及一点矩阵的操作,以及简单的C++/Java
2. 如何输出图象
我采用的就是最简单的方法,就是从纯文本ppm文件开始,不了解ppm文件的可以从下面的链接中简单了解一下,这里也不需要更深入的了解。总之,PPM是一种简单的图片格式,我们可以通过PPM进行图像相关的学习。
https://blog.youkuaiyun.com/kinghzkingkkk/article/details/70226214
让我们写一个最简单的C++/Java来输入一个简单的PPM文件
C++ :
#include <iostream>
int main() {
// Image
const int image_width = 256;
const int image_height = 256;
// Render
std::cout << "P3\n" << image_width << ' ' << image_height << "\n255\n";
for (int j = image_height-1; j >= 0; --j) {
for (int i = 0; i < image_width; ++i) {
auto r = double(i) / (image_width-1);
auto g = double(j) / (image_height-1);
auto b = 0.25;
int ir = static_cast<int>(255.999 * r);
int ig = static_cast<int>(255.999 * g);
int ib = static_cast<int>(255.999 * b);
std::cout << ir << ' ' << ig << ' ' << ib << '\n';
}
}
}
对于这个简单的文件需要注意
1. 图片中的像素按从左到右打的像素按行写出
2.行从上到下写出
之后我们会将这段代码重定向/写入到图像文件
在C++中我们使用重定向符来完成,在java中我们可以创建一个类来完成这个功能
public void writeToFile(String path) throws IOException {
FileWriter fw = new FileWriter(path);
BufferedWriter bw = new BufferedWriter(fw);
double scale = 1.0 / samplesPerPixel;