Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Graphics like Pixar using Swift

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for Kapsy Kapsy
March 21, 2019

Graphics like Pixar using Swift

These are the slides for my 5 minute lightning talk, Graphics like Pixar using Swift, given at try! Swift Tokyo 2019.

Project Github: https://github.com/kapsy/swift_ray_tracer

Video of output: https://youtu.be/0dSVm-v8W5w

Avatar for Kapsy

Kapsy

March 21, 2019
Tweet

More Decks by Kapsy

Other Decks in Programming

Transcript

  1. 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
  2. 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
  3. 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 <latexit sha1_base64="mldwIYThF30z/Reu3EmQH8CvCPg=">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=</latexit> We want to find t
  4. 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 <latexit sha1_base64="N6cA7Zxz2TFB1vDOWvmI4LM3C50=">AAAD1nichVFLb9NAEB7XPEp4NIULEpcVUSuk0mgTIYEqIQW4cOyDNJHqEq03m2RVZ9ex1yHFMjeExIkbB04gIYT4ERy4cOEIqD8BcSwSFw6MHfdBq5ax7J35dr6Zbzyu78nQULplTdgnTp46PXmmcPbc+QtTxemLq6GOAi7qXHs6aLosFJ5Uom6k8UTTDwTru55ouBv30vvGUASh1OqB2fTFep91lexIzgxCrWmr5riiK1XMPNlVSYGgzTpGjEx8hwwi1g4wkRPOFOmxoSDZlTSxViK5vhuZRxojHewCSick1F6UNgnLCXGUNqxLHCdvMEhLEzZ6WCVzxB2ROU5uE7ov7SAhU9QQmZCOVG1ieiIUez1IFErVTdF9qjs66EceWziq/wibOrwTMB7Pu8Tx+8QJB4GJXZQ1T24wniRxlSWHZBUcodo7f6xVLNEyzYwcdiq5U4LcFnXxIzjQBg0cIuiDAAUGfQ8YhPisQQUo+IitQ4xYgJ7M7gUkUEBuhFkCMxiiG/jtYrSWowrjtGaYsTl28fANkElghn6l7+k2/Uw/0B/0z5G14qxGqmUTT3fMFX5r6vnlld//ZfXxNNDbYx3D2Mk1qDFVGmas42Y00IFb2WwSZ/UzJJ2aj/sNH7/cXllYnoln6Rv6E+d9TbfoJ5xYDX/xt0ti+RWkC6scXM9hZ7VartByZalaqt3NVzcJV+AqXMP93IQa3IdFqAO33llfrG/Wd7tpP7Gf2s/GqRNWzrkE/5j94i8BJgRK</latexit> <latexit sha1_base64="N6cA7Zxz2TFB1vDOWvmI4LM3C50=">AAAD1nichVFLb9NAEB7XPEp4NIULEpcVUSuk0mgTIYEqIQW4cOyDNJHqEq03m2RVZ9ex1yHFMjeExIkbB04gIYT4ERy4cOEIqD8BcSwSFw6MHfdBq5ax7J35dr6Zbzyu78nQULplTdgnTp46PXmmcPbc+QtTxemLq6GOAi7qXHs6aLosFJ5Uom6k8UTTDwTru55ouBv30vvGUASh1OqB2fTFep91lexIzgxCrWmr5riiK1XMPNlVSYGgzTpGjEx8hwwi1g4wkRPOFOmxoSDZlTSxViK5vhuZRxojHewCSick1F6UNgnLCXGUNqxLHCdvMEhLEzZ6WCVzxB2ROU5uE7ov7SAhU9QQmZCOVG1ieiIUez1IFErVTdF9qjs66EceWziq/wibOrwTMB7Pu8Tx+8QJB4GJXZQ1T24wniRxlSWHZBUcodo7f6xVLNEyzYwcdiq5U4LcFnXxIzjQBg0cIuiDAAUGfQ8YhPisQQUo+IitQ4xYgJ7M7gUkUEBuhFkCMxiiG/jtYrSWowrjtGaYsTl28fANkElghn6l7+k2/Uw/0B/0z5G14qxGqmUTT3fMFX5r6vnlld//ZfXxNNDbYx3D2Mk1qDFVGmas42Y00IFb2WwSZ/UzJJ2aj/sNH7/cXllYnoln6Rv6E+d9TbfoJ5xYDX/xt0ti+RWkC6scXM9hZ7VartByZalaqt3NVzcJV+AqXMP93IQa3IdFqAO33llfrG/Wd7tpP7Gf2s/GqRNWzrkE/5j94i8BJgRK</latexit> <latexit sha1_base64="N6cA7Zxz2TFB1vDOWvmI4LM3C50=">AAAD1nichVFLb9NAEB7XPEp4NIULEpcVUSuk0mgTIYEqIQW4cOyDNJHqEq03m2RVZ9ex1yHFMjeExIkbB04gIYT4ERy4cOEIqD8BcSwSFw6MHfdBq5ax7J35dr6Zbzyu78nQULplTdgnTp46PXmmcPbc+QtTxemLq6GOAi7qXHs6aLosFJ5Uom6k8UTTDwTru55ouBv30vvGUASh1OqB2fTFep91lexIzgxCrWmr5riiK1XMPNlVSYGgzTpGjEx8hwwi1g4wkRPOFOmxoSDZlTSxViK5vhuZRxojHewCSick1F6UNgnLCXGUNqxLHCdvMEhLEzZ6WCVzxB2ROU5uE7ov7SAhU9QQmZCOVG1ieiIUez1IFErVTdF9qjs66EceWziq/wibOrwTMB7Pu8Tx+8QJB4GJXZQ1T24wniRxlSWHZBUcodo7f6xVLNEyzYwcdiq5U4LcFnXxIzjQBg0cIuiDAAUGfQ8YhPisQQUo+IitQ4xYgJ7M7gUkUEBuhFkCMxiiG/jtYrSWowrjtGaYsTl28fANkElghn6l7+k2/Uw/0B/0z5G14qxGqmUTT3fMFX5r6vnlld//ZfXxNNDbYx3D2Mk1qDFVGmas42Y00IFb2WwSZ/UzJJ2aj/sNH7/cXllYnoln6Rv6E+d9TbfoJ5xYDX/xt0ti+RWkC6scXM9hZ7VartByZalaqt3NVzcJV+AqXMP93IQa3IdFqAO33llfrG/Wd7tpP7Gf2s/GqRNWzrkE/5j94i8BJgRK</latexit> <latexit sha1_base64="N6cA7Zxz2TFB1vDOWvmI4LM3C50=">AAAD1nichVFLb9NAEB7XPEp4NIULEpcVUSuk0mgTIYEqIQW4cOyDNJHqEq03m2RVZ9ex1yHFMjeExIkbB04gIYT4ERy4cOEIqD8BcSwSFw6MHfdBq5ax7J35dr6Zbzyu78nQULplTdgnTp46PXmmcPbc+QtTxemLq6GOAi7qXHs6aLosFJ5Uom6k8UTTDwTru55ouBv30vvGUASh1OqB2fTFep91lexIzgxCrWmr5riiK1XMPNlVSYGgzTpGjEx8hwwi1g4wkRPOFOmxoSDZlTSxViK5vhuZRxojHewCSick1F6UNgnLCXGUNqxLHCdvMEhLEzZ6WCVzxB2ROU5uE7ov7SAhU9QQmZCOVG1ieiIUez1IFErVTdF9qjs66EceWziq/wibOrwTMB7Pu8Tx+8QJB4GJXZQ1T24wniRxlSWHZBUcodo7f6xVLNEyzYwcdiq5U4LcFnXxIzjQBg0cIuiDAAUGfQ8YhPisQQUo+IitQ4xYgJ7M7gUkUEBuhFkCMxiiG/jtYrSWowrjtGaYsTl28fANkElghn6l7+k2/Uw/0B/0z5G14qxGqmUTT3fMFX5r6vnlld//ZfXxNNDbYx3D2Mk1qDFVGmas42Y00IFb2WwSZ/UzJJ2aj/sNH7/cXllYnoln6Rv6E+d9TbfoJ5xYDX/xt0ti+RWkC6scXM9hZ7VartByZalaqt3NVzcJV+AqXMP93IQa3IdFqAO33llfrG/Wd7tpP7Gf2s/GqRNWzrkE/5j94i8BJgRK</latexit>
  5. Geometrically explained ax2 + bx + c = 0 <latexit

    sha1_base64="eKArD86Nc0L+IoDPd6w4Snc8niY=">AAACd3ichVHLSsNAFD2Nr1ofrXUjuDBYFUEoN3WhCILoxqWvquCjJHFaQ9MkJGlpLf6AP+BCEBRExc9w4w+48BPEpYIILrxNA6Ki3mFmzpy5586ZGc0xDc8neohILa1t7R3RzlhXd09vPNGXXPfssquLrG6btrupqZ4wDUtkfcM3xabjCrWkmWJDKy409jcqwvUM21rza47YKakFy8gbuuozlUskR9TqbkaekLWqPKHLszKN5BIpSlMQ8k+ghCCFMJbsxCW2sQcbOsooQcCCz9iECo/bFhQQHOZ2UGfOZWQE+wKHiLG2zFmCM1RmizwWeLUVshavGzW9QK3zKSZ3l5UyRumerumZ7uiGHun911r1oEbDS41nrakVTi5+NLD6+q+qxLOP/U/Vn5595DEdeDXYuxMwjVvoTX3l4Ph5dWZltD5G5/TE/s/ogW75BlblRb9YFisniPEHKN+f+ydYz6SVyTQtZ1Jz8+FXRDGIYYzze09hDotYQpbPreIUl7iKvElD0pg03kyVIqGmH19CUj4A1O6OrA==</latexit> x axis
  6. 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 } }
  7. 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
  8. 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