看到叶大的文章用JavaScript玩转计算机图形学(一)光线追踪入门 - Milo Yip - 博客园,里面有几个小例子,因此把这些效果用C++再实现一遍。html
bajdcc/GameFramework,这一系列停更很久了,只是没想到比较有趣的点子,拿它来练习再好不过,缘由有:Direct2D渲染、支持lua脚本、C++编写。因为是光线追踪,因此实际上能够说不依赖任何库,只要有一个CPU就能完成计算。git
目前只作了两个效果,具体的讲述移步博客,我再也不赘述。github
代码:数组
色彩图lua
这只是一个基本的例子,讲述如何经过像素操做来改变色彩。htm
咱们一张图就如同一个二阶矩阵,每一个颜色是一个int,就这么简单。blog
具体实现的过程:递归
光线追踪(左) 以及 法向量图(右)ip
左边的光线追踪我一开始也没有搞明白,等到实现以后才明白。get
实现原理很简单:
最主要操做:
理一下映射关系:3D空间-->2D屏幕,距离-->像素颜色。
右边是一个法向量图,不一样的是:并不是由距离肯定像素颜色,而是由该点法向量肯定颜色。
激光打中球时,咱们计算出交点的坐标,同时也计算出激光到该点的直线,其实就是法向量。
法向量方程有四个参数,可是这里场景很简单——球的法向量(单位向量)通过球心,因此其实只有三个参数,咱们将三个参数(-1~1)映射到RGB。
后面要完成的: