Slide 1

Slide 1 text

https://github.com/kapsy/swift_ray_tracer Graphics like Pixar using Swift @kapsy1312

Slide 2

Slide 2 text

https://github.com/kapsy/swift_ray_tracer Firstly, a movie

Slide 3

Slide 3 text

https://github.com/kapsy/swift_ray_tracer

Slide 4

Slide 4 text

Why ray trace in Swift? • Well, it’s try! Swift… • Try something I have never done before in the language • Try Swift as a bare bones language • No Platform Specific APIs or hardware • Purpose was learning

Slide 5

Slide 5 text

Ray tracing math in Swift

Slide 6

Slide 6 text

Line-sphere intersection Equation for a sphere’s surface: P · P = R 2 Equation for a ray: P = O + tD So we are looking for any t where: (O + tD) · (O + tD) O D P = O + tD P R

Slide 7

Slide 7 text

Equation for a sphere’s surface: P · P = R 2 Equation for a ray: P = O + tD So we are looking for any t where: (O + tD) · (O + tD) R 2 = 0 We can rearrange into a quadratic: O 2 + t 2 D 2 + 2ODt R 2 = 0 AAADyHichVHLbtNAFL2ueZTwaAobJDZX9EERIpqEBahSpAqChNi0TUhbqW6jsTNxrTgzZjxJCFE2LPkBFqxAQgjxGWzgA1j0ExALFkUCJBbcOFZ5NKUz8twzd+45PnPHjcIgNoztWhP2seMnTk6eypw+c/bcVHb6/Fqs2toTVU+FSm+4PBZhIEXVBCYUG5EWvOWGYt1t3hmer3eEjgMlH5heJLZa3JdBI/C4oVRt2nIdV/iB7PMw8OUggzjvGPHI9O8+bCcl2FAaOcbRjtDiSoxxWze4JxYHOE9zBR2vrgzFIpa3C+hIZbiPjnOokOa9fW4Rl/EamtIftDECFYVdgVwLDJVqBtIfKckezppZ7A59pYoLI7mrqan97fXEWxHZOH/rAj0ukZqmNZe+wEAaRUbJdl2Tcy8VXyYJktsulBJQWC6ZscIjlHGErKdNrWVnWI4lAw+CfApmIB0rKvsaHKiDAg/a0AIBEgzhEDjENDchDwwiym1Bn3KaUJCcCxhAhrhtqhJUwSnbpNWn3WaalbQfasYJ26O/hPRpYiLMsY/sDdtj79lb9on9PFSrn2gMvfQouiOuiGpTTy9Wvh3JalE0sPOb9V/PBhpwK/EakPcoyQxv4Y34ncfP9iqL5bn+PHvJPpP/F2yXvaMbyM5X79WqKD+HDD1A/t92HwRrhVz+Ro6tFmaWbqdPMQmX4DIsUL9vwhLcgxWogmd9sL5Y360f9n07srt2b1Q6YaWcC/DXsJ/8Aqi4+yc= We want to find t

Slide 8

Slide 8 text

What’s a quadratic? A quadratic can have one, two, or no solutions. ax2 + bx + c = 0 We can find these solutions using the quadratic formula: x = b ± p b2 4ac 2a AAAD1nichVFLb9NAEB7XPEp4NIULEpcVUSuk0mgTIYEqIQW4cOyDNJHqEq03m2RVZ9ex1yHFMjeExIkbB04gIYT4ERy4cOEIqD8BcSwSFw6MHfdBq5ax7J35dr6Zbzyu78nQULplTdgnTp46PXmmcPbc+QtTxemLq6GOAi7qXHs6aLosFJ5Uom6k8UTTDwTru55ouBv30vvGUASh1OqB2fTFep91lexIzgxCrWmr5riiK1XMPNlVSYGgzTpGjEx8hwwi1g4wkRPOFOmxoSDZlTSxViK5vhuZRxojHewCSick1F6UNgnLCXGUNqxLHCdvMEhLEzZ6WCVzxB2ROU5uE7ov7SAhU9QQmZCOVG1ieiIUez1IFErVTdF9qjs66EceWziq/wibOrwTMB7Pu8Tx+8QJB4GJXZQ1T24wniRxlSWHZBUcodo7f6xVLNEyzYwcdiq5U4LcFnXxIzjQBg0cIuiDAAUGfQ8YhPisQQUo+IitQ4xYgJ7M7gUkUEBuhFkCMxiiG/jtYrSWowrjtGaYsTl28fANkElghn6l7+k2/Uw/0B/0z5G14qxGqmUTT3fMFX5r6vnlld//ZfXxNNDbYx3D2Mk1qDFVGmas42Y00IFb2WwSZ/UzJJ2aj/sNH7/cXllYnoln6Rv6E+d9TbfoJ5xYDX/xt0ti+RWkC6scXM9hZ7VartByZalaqt3NVzcJV+AqXMP93IQa3IdFqAO33llfrG/Wd7tpP7Gf2s/GqRNWzrkE/5j94i8BJgRK AAAD1nichVFLb9NAEB7XPEp4NIULEpcVUSuk0mgTIYEqIQW4cOyDNJHqEq03m2RVZ9ex1yHFMjeExIkbB04gIYT4ERy4cOEIqD8BcSwSFw6MHfdBq5ax7J35dr6Zbzyu78nQULplTdgnTp46PXmmcPbc+QtTxemLq6GOAi7qXHs6aLosFJ5Uom6k8UTTDwTru55ouBv30vvGUASh1OqB2fTFep91lexIzgxCrWmr5riiK1XMPNlVSYGgzTpGjEx8hwwi1g4wkRPOFOmxoSDZlTSxViK5vhuZRxojHewCSick1F6UNgnLCXGUNqxLHCdvMEhLEzZ6WCVzxB2ROU5uE7ov7SAhU9QQmZCOVG1ieiIUez1IFErVTdF9qjs66EceWziq/wibOrwTMB7Pu8Tx+8QJB4GJXZQ1T24wniRxlSWHZBUcodo7f6xVLNEyzYwcdiq5U4LcFnXxIzjQBg0cIuiDAAUGfQ8YhPisQQUo+IitQ4xYgJ7M7gUkUEBuhFkCMxiiG/jtYrSWowrjtGaYsTl28fANkElghn6l7+k2/Uw/0B/0z5G14qxGqmUTT3fMFX5r6vnlld//ZfXxNNDbYx3D2Mk1qDFVGmas42Y00IFb2WwSZ/UzJJ2aj/sNH7/cXllYnoln6Rv6E+d9TbfoJ5xYDX/xt0ti+RWkC6scXM9hZ7VartByZalaqt3NVzcJV+AqXMP93IQa3IdFqAO33llfrG/Wd7tpP7Gf2s/GqRNWzrkE/5j94i8BJgRK AAAD1nichVFLb9NAEB7XPEp4NIULEpcVUSuk0mgTIYEqIQW4cOyDNJHqEq03m2RVZ9ex1yHFMjeExIkbB04gIYT4ERy4cOEIqD8BcSwSFw6MHfdBq5ax7J35dr6Zbzyu78nQULplTdgnTp46PXmmcPbc+QtTxemLq6GOAi7qXHs6aLosFJ5Uom6k8UTTDwTru55ouBv30vvGUASh1OqB2fTFep91lexIzgxCrWmr5riiK1XMPNlVSYGgzTpGjEx8hwwi1g4wkRPOFOmxoSDZlTSxViK5vhuZRxojHewCSick1F6UNgnLCXGUNqxLHCdvMEhLEzZ6WCVzxB2ROU5uE7ov7SAhU9QQmZCOVG1ieiIUez1IFErVTdF9qjs66EceWziq/wibOrwTMB7Pu8Tx+8QJB4GJXZQ1T24wniRxlSWHZBUcodo7f6xVLNEyzYwcdiq5U4LcFnXxIzjQBg0cIuiDAAUGfQ8YhPisQQUo+IitQ4xYgJ7M7gUkUEBuhFkCMxiiG/jtYrSWowrjtGaYsTl28fANkElghn6l7+k2/Uw/0B/0z5G14qxGqmUTT3fMFX5r6vnlld//ZfXxNNDbYx3D2Mk1qDFVGmas42Y00IFb2WwSZ/UzJJ2aj/sNH7/cXllYnoln6Rv6E+d9TbfoJ5xYDX/xt0ti+RWkC6scXM9hZ7VartByZalaqt3NVzcJV+AqXMP93IQa3IdFqAO33llfrG/Wd7tpP7Gf2s/GqRNWzrkE/5j94i8BJgRK AAAD1nichVFLb9NAEB7XPEp4NIULEpcVUSuk0mgTIYEqIQW4cOyDNJHqEq03m2RVZ9ex1yHFMjeExIkbB04gIYT4ERy4cOEIqD8BcSwSFw6MHfdBq5ax7J35dr6Zbzyu78nQULplTdgnTp46PXmmcPbc+QtTxemLq6GOAi7qXHs6aLosFJ5Uom6k8UTTDwTru55ouBv30vvGUASh1OqB2fTFep91lexIzgxCrWmr5riiK1XMPNlVSYGgzTpGjEx8hwwi1g4wkRPOFOmxoSDZlTSxViK5vhuZRxojHewCSick1F6UNgnLCXGUNqxLHCdvMEhLEzZ6WCVzxB2ROU5uE7ov7SAhU9QQmZCOVG1ieiIUez1IFErVTdF9qjs66EceWziq/wibOrwTMB7Pu8Tx+8QJB4GJXZQ1T24wniRxlSWHZBUcodo7f6xVLNEyzYwcdiq5U4LcFnXxIzjQBg0cIuiDAAUGfQ8YhPisQQUo+IitQ4xYgJ7M7gUkUEBuhFkCMxiiG/jtYrSWowrjtGaYsTl28fANkElghn6l7+k2/Uw/0B/0z5G14qxGqmUTT3fMFX5r6vnlld//ZfXxNNDbYx3D2Mk1qDFVGmas42Y00IFb2WwSZ/UzJJ2aj/sNH7/cXllYnoln6Rv6E+d9TbfoJ5xYDX/xt0ti+RWkC6scXM9hZ7VartByZalaqt3NVzcJV+AqXMP93IQa3IdFqAO33llfrG/Wd7tpP7Gf2s/GqRNWzrkE/5j94i8BJgRK

Slide 9

Slide 9 text

Geometrically explained ax2 + bx + c = 0 AAACd3ichVHLSsNAFD2Nr1ofrXUjuDBYFUEoN3WhCILoxqWvquCjJHFaQ9MkJGlpLf6AP+BCEBRExc9w4w+48BPEpYIILrxNA6Ki3mFmzpy5586ZGc0xDc8neohILa1t7R3RzlhXd09vPNGXXPfssquLrG6btrupqZ4wDUtkfcM3xabjCrWkmWJDKy409jcqwvUM21rza47YKakFy8gbuuozlUskR9TqbkaekLWqPKHLszKN5BIpSlMQ8k+ghCCFMJbsxCW2sQcbOsooQcCCz9iECo/bFhQQHOZ2UGfOZWQE+wKHiLG2zFmCM1RmizwWeLUVshavGzW9QK3zKSZ3l5UyRumerumZ7uiGHun911r1oEbDS41nrakVTi5+NLD6+q+qxLOP/U/Vn5595DEdeDXYuxMwjVvoTX3l4Ph5dWZltD5G5/TE/s/ogW75BlblRb9YFisniPEHKN+f+ydYz6SVyTQtZ1Jz8+FXRDGIYYzze09hDotYQpbPreIUl7iKvElD0pg03kyVIqGmH19CUj4A1O6OrA== x axis

Slide 10

Slide 10 text

As a sphere and ray We can have one, two, or no intersections.

Slide 11

Slide 11 text

In Swift… let oc = ray.origin - sphere.center // Our quadratic constants let a = dot(ray.dir, ray.dir) let b = dot(oc, ray.dir) let c = dot(oc, oc) - sphere.radius*sphere.radius // Obtain discriminant and check sign let discriminant = b*b - a*c; if discriminant > 0.0 { var t = (-b - sqrt(discriminant))/a if (tnear < t && t < tfar) { P = t*ray.dir // Intersection, find P using ray equation tfar = t } t = (-b + sqrt(discriminant))/a if (tnear < t && t < tfar) { P = t*ray.dir // Intersection, find P using ray equation tfar = t } }

Slide 12

Slide 12 text

How does it look?

Slide 13

Slide 13 text

With normals

Slide 14

Slide 14 text

With Lambertian material

Slide 15

Slide 15 text

Finally… • Really try to understand your domain… • …No matter what that may be • Time invested in knowledge is never wasted • Always challenge yourself! https://github.com/kapsy/swift_ray_tracer

Slide 16

Slide 16 text

References • Ray Tracing Minibooks, Pete Shirley • Scratchapixel 2.0 • Ray-Triangle Intersection, Möller–Trumbore • Wikipedia: Cramer’s rule • On building fast kd-Trees for Ray Tracing, Wald-Havran • Realtime Ray Tracing and Interactive Global Illumination, Wald