光线追踪1 输出一张 ppm 格式图

Wikipedia 上对ppm文件的解释

.ppm 格式文件,水平向右为x轴正方向,以垂直向下为y正方向,解读如下:

第一行 P3 表示为文件type为 Pixmap 格式。

3 2 分别表示列数和行数,或者理解为x轴的长度和y轴的长度,或理解为图形的宽和高。

再往下一行 255 表示像素的最大值

之后有x * y个(r,g,b)三元组,它会按照顺序读取,并且在图像的左上角开始一行一行扫描设置像素值。

#include <iostream>

int main() {    
// Image    
int image_width = 256;    
int image_height = 256;    
// Render    
std::cout << "P3\n" << image_width << ' ' << image_height << "\n255\n";   
 for (int j = 0; j < image_height; ++j) {        
	std::clog << "\rScanlines remaining: " << (image_height - j) << ' ' << std::flush;
	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;            
		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';
	}
    }
	std::clog << "\rDone.                 \n";
}

在这段代码中,有一些需要注意的事项:

像素按行输出。

每行像素从左到右进行输出。

这些行按照从上到下的顺序进行输出。

根据约定,每个红/绿/蓝分量在内部使用取值范围为0.0到1.0的实值变量表示。在打印输出之前,必须将它们缩放为0到255之间的整数值。

红色从完全关闭(黑色)向右边逐渐变亮(鲜红),绿色从顶部完全关闭逐渐变暗(黑色)至底部。将红光和绿光混合会产生黄色,因此我们预期右下角应该是黄色的。

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值