Skip to content

Commit

Permalink
Added defocus blur
Browse files Browse the repository at this point in the history
  • Loading branch information
DheerendraRathor committed Sep 19, 2017
1 parent 51161a7 commit f0cf0ed
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 28 deletions.
25 changes: 14 additions & 11 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,17 +13,18 @@ import (
)

const (
MaxDepth = 10
MaxDepth = 100
)

func main() {
lookFrom := models.NewPoint(-3, 1, 0.5)
lookAt := models.NewPoint(0, 0, -0.5)
lookFrom := models.NewPoint(-2, 1, 0.5)
lookAt := models.NewPoint(0, 0, -1)
vUp := models.NewVector3D(0, 1, 0)
camera := models.NewCamera(lookFrom, lookAt, vUp, 45, 2)
focus := models.SubtractVectors(lookFrom, lookAt).Length()
camera := models.NewCamera(lookFrom, lookAt, vUp, 45, 2, focus/32, focus)

rows, columns := 200, 400
sample := 100
sample := 1000

world := models.HitableList{}

Expand All @@ -32,6 +33,7 @@ func main() {
world.AddHitable(models.NewSphere(1, 0, -1, 0.5, models.NewMetal(0.8, 0.6, 0.2, 0.2)))
world.AddHitable(models.NewSphere(-1, 0, -1, 0.5, models.NewDielectric(1.3)))
world.AddHitable(models.NewSphere(-1, 0, -1.75, 0.25, models.NewLambertian(0.2, 0.2, 0.7)))
world.AddHitable(models.NewSphere(10, 0.5, -10, 1, models.NewMetal(0.3, 0.4, 0.7, 0.0)))

progress := make(chan bool, 100)
var pbWg, renderWg sync.WaitGroup
Expand All @@ -42,6 +44,8 @@ func main() {
defer pbWg.Done()
total := rows * columns
bar := pb.StartNew(total)
bar.ShowFinalTime = true
bar.ShowTimeLeft = false
for value := range progress {
if value {
break
Expand Down Expand Up @@ -78,17 +82,16 @@ func main() {
}

func ProcessPixel(i, j, rows, columns, sample int, camera *models.Camera, world *models.HitableList, pngImage *image.RGBA) {
pixel := models.NewPixel(0, 0, 0)
colorVector := models.NewVector3D(0, 0, 0)
for s := 0; s < sample; s++ {
randFloatu, randFloatv := rand.Float64(), rand.Float64()
u, v := (float64(j)+randFloatu)/float64(columns), (float64(i)+randFloatv)/float64(rows)
ray := camera.RayAt(u, v)
pixel = models.NewPixelFromVector(
models.AddVectors(pixel, Color(ray, *world, 0)),
)
colorVector = models.AddVectors(colorVector, Color(ray, *world, 0))
}
pixel = models.NewPixelFromVector(
models.DivideScalar(pixel, float64(sample)),

pixel := models.NewPixelFromVector(
models.DivideScalar(colorVector, float64(sample)),
)
pixel.Gamma2()
uint8Pixel := pixel.UInt8Pixel()
Expand Down
57 changes: 40 additions & 17 deletions models/camera.go
Original file line number Diff line number Diff line change
@@ -1,46 +1,69 @@
package models

import "math"
import (
"math"
"math/rand"
)

type Camera struct {
LowerLeftCorner Point
Horizontal Vector3D
Vertical Vector3D
Origin Point
LowerLeftCorner, Origin Point
Horizontal, Vertical Vector3D
LensRadius float64
U, V, W Vector3D
}

func (c Camera) RayAt(u, v float64) Ray {

rd := MultiplyScalar(RandomPointInUnitDisk(), c.LensRadius)
offset := AddVectors(MultiplyScalar(c.U, rd.X()), MultiplyScalar(c.V, rd.Y()))
origin := AddVectors(c.Origin, offset)

horizontalDir := AddVectors(c.LowerLeftCorner, MultiplyScalar(c.Horizontal, u))
compositeDir := AddVectors(horizontalDir, MultiplyScalar(c.Vertical, v))
compositeDir = SubtractVectors(compositeDir, c.Origin)
compositeDir = SubtractVectors(compositeDir, origin)
return Ray{
c.Origin,
NewPointByVector(origin),
compositeDir,
}
}

func NewCamera(lookFrom, lookAt Point, vup Vector3D, vfov, aspect float64) Camera {
func NewCamera(lookFrom, lookAt Point, vup Vector3D, vfov, aspect, aperture, focus float64) Camera {
theta := vfov * math.Pi / 180
half_height := math.Tan(theta / 2)

wVector := SubtractVectors(lookFrom, lookAt)

half_height *= wVector.Length()
//half_height *= wVector.Length()
half_width := aspect * half_height

w := UnitVector(wVector)
w := UnitVector(SubtractVectors(lookFrom, lookAt))
u := UnitVector(VectorCrossProduct(vup, w))
v := VectorCrossProduct(w, u)

//llc := NewPoint(-half_width, -half_height, -1.0)
llc := SubtractVectors(lookFrom, MultiplyScalar(u, half_width))
llc = SubtractVectors(llc, MultiplyScalar(v, half_height))
llc = SubtractVectors(llc, wVector)
llc := SubtractVectors(lookFrom, MultiplyScalar(u, half_width*focus))
llc = SubtractVectors(llc, MultiplyScalar(v, half_height*focus))
llc = SubtractVectors(llc, MultiplyScalar(w, focus))

return Camera{
LowerLeftCorner: NewPointByVector(llc),
Horizontal: MultiplyScalar(u, 2*half_width),
Vertical: MultiplyScalar(v, 2*half_height),
Horizontal: MultiplyScalar(u, 2*half_width*focus),
Vertical: MultiplyScalar(v, 2*half_height*focus),
Origin: lookFrom,
LensRadius: aperture / 2,
U: u,
V: v,
W: w,
}
}

func RandomPointInUnitDisk() Point {
var p Point
for {
x, y, z := 2*rand.Float64()-1, 2*rand.Float64()-1, 0.0
p = NewPoint(x, y, z)
if VectorDotProduct(p, p) < 1.0 {
break
}
}

return p
}

0 comments on commit f0cf0ed

Please sign in to comment.