Working camera
So yesterday’s attempt at capturing an image didn’t turn out so well, because I messed up the camera, or rather the vector algebra behind everything. When I realized what I had done, I instantly remembered that similar lesson from last year; because points have w=1
, while vectors have w=0
, almost all vector operations will get messed up by the extra 1
, if you accidentally use a point instead. Or vice versa.
When fixing that I also realized I forgot to translate the camera away from the origin of the sphere I tried to take a picture of, but the vector/point mess-up had accidentally warped space to get a decent composition anyway.
typealias Transform = simd_double4x4
extension Transform {
static func translate(to position: Point) -> Transform {
simd_matrix(.vector(1,0,0),
.vector(0,1,0),
.vector(0,0,1),
position)
}
}
And with that, the “camera light” shaded sphere is rendered at full intensity.
Next related
Light and Magic
The next natural step after getting basic shading to work is to have actual light sources, that can be tinted and positioned in the scene.
Previous related
Actual pixels
First actual image generated, using a “camera light”. The shading is too dark, for some reason I can’t figure out at the moment, so I guess tomorrow will be more of a debugging session than new feature creation.
Pixels on a canvas
Pretty much the whole point of a ray tracer such as this one is to render pretty pictures, and for that we’re going to need a canvas to render onto.
Surface normals
Today brings normal vectors into the mix, a critical component for shading computations; the normal vector of a surface at the point where it was hit by a ray, to be precise. Because the normal depends on the hit position on the surface, and we’ll need that too, we keep that around as well.