Kai Ninomiya
for DSC IZTECH
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
Follow along: slides.com/kainino/ggr
slides.com/kainino/ggr
"Snail"
by iq (Inigo Quilez)
(not a video - this is rendering live in the web browser!)
slides.com/kainino/ggr
slides.com/kainino/ggr
from nvidia.com from intel.com
slides.com/kainino/ggr
from intel.com
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
NVIDIA GPU ≠ AMD GPU ≠ Intel GPU ≠ Qualcomm GPU ≠ ARM GPU ≠ Imagination GPU ≠ ...
Still very different architectures despite commonalities
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
1 per GPU
Few per GPU
Graphics Processing Cluster
Streaming Multiprocessor
slides.com/kainino/ggr
Streaming Multiprocessor
1 per SM
Few per SM
slides.com/kainino/ggr
(Gleaned from skimming whitepapers; may not be exactly correct)
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
from nvidia.com
All SIMD lanes are still operating here, but
the result is just discarded
("wasted" computation)
slides.com/kainino/ggr
slides.com/kainino/ggr
"studies methods for digitally synthesizing and manipulating visual content"
(Wikipedia)
slides.com/kainino/ggr
That, but 3D
slides.com/kainino/ggr
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from CMU 15294
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from SimmPole on imgur
slides.com/kainino/ggr
from OpenGL Insights
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
Plane
Sphere
Line/ray
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
slides.com/kainino/ggr
Circle
Triangle
float sdCircle( vec2 p, float r ) {
return length(p) - r;
}
by Inigo Quilez
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
Plane
Sphere
from wikipedia.org
slides.com/kainino/ggr
slides.com/kainino/ggr
^ Go here for code
slides.com/kainino/ggr
float distToPlane( in vec3 pointInPlane, in vec3 planeNormal, in vec3 ro, in vec3 rd ) { float divisor = dot(rd, planeNormal); if (abs(divisor) < 0.001) { // Ray is approximately parallel to the plane return NO_HIT; } float d = dot(pointInPlane - ro, planeNormal) / divisor; // d < 0 means the intersection was behind the camera, so don't count it return d < 0.0 ? NO_HIT : d; }
slides.com/kainino/ggr
float distToSphere( in vec3 sphereCenter, in float sphereRadius, in vec3 ro, in vec3 rd ) {
vec3 roRelativeToSphere = ro - sphereCenter;
float discriminant = pow(dot(rd, roRelativeToSphere), 2.0) -
(dot(roRelativeToSphere, roRelativeToSphere) - pow(sphereRadius, 2.0));
if (discriminant < 0.0) { // The ray does not intersect the sphere
return NO_HIT;
}
// Math says there are two intersections with the sphere:
// (...) +/- sqrt(discriminant)
// But we are only interested in the closer intersection.
float d = -dot(rd, roRelativeToSphere) - sqrt(discriminant);
return d < 0.0 ? NO_HIT : d;
}
slides.com/kainino/ggr
float distToClosestObjectInScene( in vec3 ro, in vec3 rd ) {
float d = NO_HIT;
d = min(d, distToSphere(/*center*/ vec3(0, 0, 0), /*radius*/ 0.5, ro, rd));
d = min(d, distToSphere(/*center*/ vec3(1, 0.5, -0.5), /*radius*/ 0.5, ro, rd));
d = min(d, distToSphere(/*center*/ vec3(-1, 0, -0.5), /*radius*/ 0.5, ro, rd));
d = min(d, distToPlane(/*pointInPlane*/ vec3(0, -1, 0), /*normal*/ vec3(0, 1, 0), ro, rd));
return d;
}
vec3 render( in vec3 ro, in vec3 rd ) {
float d = distToClosestObjectInScene(ro, rd);
return vec3(d * 0.02); // Visualize the distance as a color
}
slides.com/kainino/ggr
slides.com/kainino/ggr
from flafla2.github.io
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
from flafla2.github.io
slides.com/kainino/ggr
slides.com/kainino/ggr
slides.com/kainino/ggr
float sdPlane( vec3 probe, vec3 planeScaledNormal ) {
return (probe - planeScaledNormal).y;
}
float sdSphere( vec3 probe, vec3 sphereCenter, float sphereRadius ){
return length(probe - sphereCenter) - sphereRadius;
}
float sdUnion(float a, float b){
return min(a, b);
}
float map( in vec3 pos ){
float res = 1e10;
res = sdUnion( res, sdPlane( pos, vec3( 0.0, -1.0, 0.0) ) );
res = sdUnion( res, sdSphere( pos, vec3( 0.0, 0.0, 0.0), 0.5 ) );
res = sdUnion( res, sdSphere( pos, vec3( 1.5, 0.5, -0.5), 0.25 ) );
return res;
}
slides.com/kainino/ggr
#define MAX_ITERATIONS 150 float castRay( in vec3 ro, in vec3 rd ) { // raymarch primitives float distAlongRay = 0.0; for( int i=0; i < MAX_ITERATIONS; i++ ) { // Probe the SDF map float sdValue = map( ro + rd * distAlongRay ); if( abs(sdValue) < (0.0001 * distAlongRay) ) { return distAlongRay; } distAlongRay += sdValue; // <- sphere tracing! } return -1.0; // nothing found }
// (and then we visualize distAlongRay as a color, like before.)
slides.com/kainino/ggr
slides.com/kainino/ggr
(again)
slides.com/kainino/ggr
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
from wikipedia.org
slides.com/kainino/ggr
slides.com/kainino/ggr
(alternating physically accurate shadows (grainy) with approximated shadows (smooth))
slides.com/kainino/ggr
Check out iq's Raymarching - Primitives for a nice demo of all of these together
slides.com/kainino/ggr
slides.com/kainino/ggr
"Snail"
by iq (Inigo Quilez)
slides.com/kainino/ggr
by knarkowicz
(All video in one shader - and every pixel is completely independent!
Audio is also generated by a shader run on the GPU.)
... also by knarkowicz
(4 stages + one for audio)