Preface

从这一篇起,我们开始学光线追踪这门牛逼的技术。读了几天,一个字:强!

这一篇我们主要讲述技术入门和一些简单的案例。

我们先学这本:

Ready

这本书需要ppmview这个软件帮忙看效果图,不过下载也非常快。

其次,需要你会C/C++读写文件

最后需要你具备三维空间想象能力以及我对书中公式的讲述

Chapter1: Output an image

先看一张图,秒懂一下它如何设置像素

话说,有这么一个文件,叫做.ppm文件。它以水平向右为x正方向,以垂直向下为y正方向。

它的文件存储内容解读如上,关于第一行的P3是指文件的type

P3下面那两个数指的是列数和行数,或者你可以理解为x轴的长度和y轴的长度,或者理解为图像的宽和高。

再下面一行有一个数为像素的最大值

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

所以我们现在开始写代码实现上面那个图像,但是我按照上面的输入到文件中,由于只有6个像素点,我几乎看不到任何图像,我不知道你们的情况,所以我自己设定一个例子:

我设定上面那个图像的每一个颜色方格为20*20尺寸的。然后每个方格对应自己的像素值。

代码如下:

#define stds std::
void build_1_1()
{
const stds string s1[] = { "255 0 0","0 255 0","0 0 255" };
const stds string s2[] = { "255 255 0","255 255 255","0 0 0" }; stds ofstream file("graph1-1.ppm");
if (file.is_open())
{
file << "P3\n" << << " " << << "\n255\n";
for (int i = ; i < ; ++i)
for (int j = ; j < ; ++j)
file << s1[j / ] << stds endl; for (int i = ; i < ; ++i)
for (int j = ; j < ; ++j)
file << s2[j / ] << stds endl;
file.close();
stds cout << "complished" << stds endl;
}
else stds cerr << "error" << stds endl;
}

然后我们用ppmview打开就是这样的:

    

好了,大家估计明白了我们这个文件的使用

那我们来整一个好玩的。

这是书上的代码,如果你能够看懂,那固然很好,不过看不懂也没关系

它说了个啥意思呢?

它先设置三个量r,g,b,它们的值在[0,1),然后通过乘255.99将值映射到[0,255]

好了我们可以看第一个像素:(0,255,0.2),应该是绿色的,如果觉得blue的0.2有点干扰,你可以设为0(建议这么做),第一行扫完之后,也就是内部for第一次跳出的时候,那个像素是(255,255,0.2),差不多是r和g组合,接近黄色,那么第一行就是r从0到255,绿色到黄色渐变。用同样的方法,我们可以知道,左下角这个点应该是近黑色,右下角应该是近红色。中间的内容是线性插值得到的像素值。

 Chapter 2:The vec3 class

此章节,以及后面的部分,数学部分直接引用现写的3D数学库

转到:https://www.cnblogs.com/lv-anchoret/p/10163085.html

这一章就是将上述rgb用三维向量表示:

#define LOWPRECISION

#include <fstream>
#include <lvgm\lvgm.h>
using namespace lvgm; #define stds std:: void build_1_2()
{
int X = , Y = ;
stds ofstream file("graph2-1.ppm");
if (file.is_open())
{
file << "P3\n" << X << " " << Y << "\n255\n";
for (int j = Y - ; j >= ; --j)
for (int i = ; i < X; ++i)
{
dvec3 col(double(i) / X, double(j) / Y, 0.0);
int ir = int(255.99*col.r());
int ig = int(255.99*col.g());
int ib = int(255.99*col.b());
file << ir << " " << ig << " " << ib << stds endl;
}
file.close();
stds cout << "complished" << stds endl;
}
else
stds cerr << "load file failed!" << stds endl;
} int main()
{
build_1_2(); }

把blue改为0,图像就清晰多了

由于今日天色已晚,咱们明天继续

感谢您的阅读,晚安~

【Ray Tracing in One Weekend 超详解】 光线追踪1-1的更多相关文章

  1. 【Ray Tracing The Next Week 超详解】 光线追踪2-9

    我们来整理一下项目的代码 目录 ----include --hit --texture --material ----RTdef.hpp ----ray.hpp ----camera.hpp ---- ...

  2. 【Ray Tracing The Next Week 超详解】 光线追踪2-6 Cornell box

    Chapter 6:Rectangles and Lights 今天,我们来学习长方形区域光照  先看效果 light 首先我们需要设计一个发光的材质 /// light.hpp // ------- ...

  3. 【Ray Tracing in One Weekend 超详解】 光线追踪1-4

    我们上一篇写了Chapter5 的第一个部分表面法线,那么我们来学剩下的部分,以及Chapter6. Chapter5:Surface normals and multiple objects. 我们 ...

  4. 【Ray Tracing The Next Week 超详解】 光线追踪2-7 任意长方体 && 场景案例

    上一篇比较简单,很久才发是因为做了一些好玩的场景,后来发现这一章是专门写场景例子的,所以就安排到了这一篇 Preface 这一篇要介绍的内容有: 1. 自己做的光照例子 2. Cornell box画 ...

  5. 【Ray Tracing The Next Week 超详解】 光线追踪2-8 Volume

     Preface 今天有两个东东,一个是体积烟雾,一个是封面图 下一篇我们总结项目代码 Chapter 8:Volumes 我们需要为我们的光线追踪器添加新的物体——烟.雾,也称为participat ...

  6. 【Ray Tracing The Next Week 超详解】 光线追踪2-5

    Chapter 5:Image Texture Mapping 先看效果: 我们之前的纹理是利用的是撞击点p处的位置信息,比如大理石纹理 而我们今天的图片映射纹理采用2D(u,v)纹理坐标来进行. 在 ...

  7. 【Ray Tracing in One Weekend 超详解】 光线追踪1-8 自定义相机设计

    今天,我们来学习如何设计自定义位置的相机 ready 我们只需要了解我们之前的坐标体系,或者说是相机位置 先看效果   Chapter10:Positionable camera 这一章我们直接用概念 ...

  8. 【Ray Tracing The Next Week 超详解】 光线追踪2-4 Perlin noise

     Preface 为了得到更好的纹理,很多人采用各种形式的柏林噪声(该命名来自于发明人 Ken Perlin) 柏林噪声是一种比较模糊的白噪声的东西:(引用书中一张图) 柏林噪声是用来生成一些看似杂乱 ...

  9. 【Ray Tracing The Next Week 超详解】 光线追踪2-3

     Preface 终于到了激动人心的纹理章节了 然鹅,看了下,并不激动 因为我们之前就接触过 当初有一个 attenuation 吗? 对了,这就是我们的rgb分量过滤器,我们画出的红色.蓝色.绿色等 ...

  10. 【Ray Tracing The Next Week 超详解】 光线追踪2-2

    Chapter 2:Bounding Volume Hierarchies 今天我们来讲层次包围盒,乍一看比较难,篇幅也多,但是咱们一步一步来,相信大家应该都能听懂 BVH 和 Perlin text ...

随机推荐

  1. UiAutomator2.0入门

    总是听说UiAutomator这个框架,但从来没有使用过.找了篇入门,实践一下.实践之后感觉,uiautomator写测试代码,还是有点费劲.接口名比较多,比较长.网易的atx里使用的uiautoma ...

  2. Flink入门训练--以New York City Taxi为例

    最近在学Flink,准备用Flink搭建一个实时的推荐系统.找到一个好的网站(也算作是flink创始者的官方网站),上面有关于Flink的上手教程,用来练练手,熟悉熟悉,下文仅仅是我的笔记. 1. 数 ...

  3. PAM认证机制详情

    PAM(Pluggable Authentication Modules)认证机制详情 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.      一.介绍PAM PAM(Plugga ...

  4. JAVA-Servlet内容

    Servlet重定向 HttpServletResponse接口的sendRedirect()方法可以用于将响应重定向到另一个资源,资源可能是servlet,jsp或html文件. 它接受相对和绝对U ...

  5. [整理]CSS3 滤镜

    1.灰度 兼容 http://www.526net.com/blog/qianduan/226.html http://james.padolsey.com/demos/grayscale/grays ...

  6. [机器学习&数据挖掘]朴素贝叶斯数学原理

    1.准备: (1)先验概率:根据以往经验和分析得到的概率,也就是通常的概率,在全概率公式中表现是“由因求果”的果 (2)后验概率:指在得到“结果”的信息后重新修正的概率,通常为条件概率(但条件概率不全 ...

  7. c++刷题(37/100)笔试题2

    4道题2小时,又是一道,不过这次的比较难,但第二道不应该的,又是审题不仔细导致没过 题目1: 给定一个字符串,请你将字符串重新编码,将连续的字符替换成“连续出现的个数+字符”.比如字符串AAAABCC ...

  8. HTML5+CSS把footer固定在底部

    在刚开始给网页写footer的时候,我们会碰到一个让人烦躁的问题:当页面内容太少时,footer显示在了页面中间,这是我们不希望出现的,我们希望它能够永远呆在底部,不管网页的内容是多还是少.下面的代码 ...

  9. 产品排序(2015 年北大自招夏令营) (与栈相关的区间DP)

    题面: \(solution:\) 又是一道\(DP\)的好题啊!状态并不明显,需要仔细分析,而且还结合了栈的特性! 做这一类题,只要出题人有点理想,一定会在栈的性质上做点文章,所以我们尽量围绕栈的性 ...

  10. python所有基础

    下面就不一一列举了,所有的资料都和GitHub对接,到时候我有更新就直接拖到GitHub上面了.入门的小伙伴们可以进来看看,估计后面还会有很多项目,待更新.