Chapter 11 done
This commit is contained in:
parent
d167c2074e
commit
6de86045ba
2 changed files with 81245 additions and 81218 deletions
37
main.go
37
main.go
|
@ -119,7 +119,8 @@ func q_rsqrt(v Vec3) float32 {
|
||||||
}
|
}
|
||||||
|
|
||||||
func Unit_vector(v Vec3) Vec3 {
|
func Unit_vector(v Vec3) Vec3 {
|
||||||
new_v := v.Mult(q_rsqrt(v))
|
//new_v := v.Mult(q_rsqrt(v))
|
||||||
|
new_v := v.Mult(1.0/float32(math.Sqrt(float64(v.Length_squared()))))
|
||||||
return new_v
|
return new_v
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,6 +396,13 @@ func NewMaterial(m int, a Vec3, f float32, i float32) Material {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func Reflectance(cosine float32, ref_idx float32) float32 {
|
||||||
|
// Use Schlick's approximation for reflectance
|
||||||
|
r0 := (1.0-ref_idx) / (1.0+ref_idx)
|
||||||
|
r0 = r0*r0
|
||||||
|
return r0 + (1.0-r0)*float32(math.Pow(float64(1 - cosine), 5))
|
||||||
|
}
|
||||||
|
|
||||||
func (mat Material) Scatter(r_in *Ray, rec *Hit_record, attenuation *Vec3, scattered *Ray) bool {
|
func (mat Material) Scatter(r_in *Ray, rec *Hit_record, attenuation *Vec3, scattered *Ray) bool {
|
||||||
if (mat.material == 0) { //Lambertian
|
if (mat.material == 0) { //Lambertian
|
||||||
scatter_direction := rec.normal.Add(RandomUnitVector())
|
scatter_direction := rec.normal.Add(RandomUnitVector())
|
||||||
|
@ -421,8 +429,22 @@ func (mat Material) Scatter(r_in *Ray, rec *Hit_record, attenuation *Vec3, scatt
|
||||||
refraction_ration = mat.ir
|
refraction_ration = mat.ir
|
||||||
}
|
}
|
||||||
unit_direction := Unit_vector(r_in.Direction())
|
unit_direction := Unit_vector(r_in.Direction())
|
||||||
refracted := Refract(unit_direction, rec.normal, refraction_ration)
|
|
||||||
*scattered = *NewRay(rec.p, refracted)
|
cos_theta := float32(math.Min(float64(Dot(unit_direction.Neg(), rec.normal)), 1.0))
|
||||||
|
sin_theta := float32(math.Sqrt(float64(1.0 - cos_theta*cos_theta)))
|
||||||
|
var cannot_refract bool
|
||||||
|
var direction Vec3
|
||||||
|
if (refraction_ration * sin_theta > 1.0) {
|
||||||
|
cannot_refract = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cannot_refract || Reflectance(cos_theta, refraction_ration) > RandomDouble()) {
|
||||||
|
direction = Reflect(unit_direction, rec.normal)
|
||||||
|
} else {
|
||||||
|
direction = Refract(unit_direction, rec.normal, refraction_ration)
|
||||||
|
}
|
||||||
|
|
||||||
|
*scattered = *NewRay(rec.p, direction)
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
@ -531,9 +553,9 @@ func (cam *Camera) Pixel_sample_square() Vec3 {
|
||||||
func main() {
|
func main() {
|
||||||
// Materials
|
// Materials
|
||||||
material_ground := NewMaterial(0, NewColor(0.8, 0.8, 0.0), 0.0, 0.0)
|
material_ground := NewMaterial(0, NewColor(0.8, 0.8, 0.0), 0.0, 0.0)
|
||||||
material_center := NewMaterial(2, NewColor(0.7, 0.3, 0.3), 0.0, 1.5)
|
material_center := NewMaterial(0, NewColor(0.1, 0.2, 0.5), 0.0, 1.5)
|
||||||
material_left := NewMaterial(2, NewColor(0.8, 0.8, 0.8), 0.3, 1.5)
|
material_left := NewMaterial(2, NewColor(0.8, 0.8, 0.8), 0.3, 1.5)
|
||||||
material_right := NewMaterial(1, NewColor(0.8, 0.6, 0.2), 1.0, 0.0)
|
material_right := NewMaterial(1, NewColor(0.8, 0.6, 0.2), 0.0, 0.0)
|
||||||
|
|
||||||
// World
|
// World
|
||||||
|
|
||||||
|
@ -553,6 +575,11 @@ func main() {
|
||||||
radius: 0.5,
|
radius: 0.5,
|
||||||
mat: material_left,
|
mat: material_left,
|
||||||
})
|
})
|
||||||
|
world.Add(Sphere{
|
||||||
|
center: NewVec3(-1.0, 0, -1.0),
|
||||||
|
radius: -0.4,
|
||||||
|
mat: material_left,
|
||||||
|
})
|
||||||
world.Add(Sphere{
|
world.Add(Sphere{
|
||||||
center: NewVec3(1.0, 0, -1.0),
|
center: NewVec3(1.0, 0, -1.0),
|
||||||
radius: 0.5,
|
radius: 0.5,
|
||||||
|
|
Loading…
Reference in a new issue