{{ message }}

Instantly share code, notes, and snippets.

# sebbbi/fast_spheres.txt

Created Feb 18, 2018
Fast way to render lots of spheres
 Setup: 1. Index buffer containing N quads (each 2 triangles), where N is the max amount of spheres. Repeating pattern of {0,1,2,1,3,2} + K*4. 2. No vertex buffer. Render N*2 triangles, where N is the number of spheres you have. Vertex shader: 1. Sphere index = N/4 (N = SV_VertexId) 2. Quad coord: Q = float2(N%2, (N%4)/2) * 2.0 - 1.0 3. Transform sphere center -> pos 4. Calculate the optimal oriented bounding box of the sphere. See: http://www.iquilezles.org/www/articles/sphereproj/sphereproj.htm 5. Output bounding box vertex (xy): pos + bbox_xaxis * Q.x + bbox_yaxis * Q.y 6. Bias depth output by sphere radius. (we want front of the sphere) Pixel shader: 1. Calculate ray-sphere intersection: https://en.wikipedia.org/wiki/Line%E2%80%93sphere_intersection 2. If ray misses sphere, discard the pixel. 3. Calculate surface position and normal using the ray-sphere intersection result. 4. Calculate all g-buffer outputs, shading, etc that you need. 5. Output depth calculated with ray-sphere intersection. 6. Use SV_DepthGreaterEqual conservative depth output. This way you get HiZ culling (measured up to 6x speedup vs SV_Depth) Preferably sort spheres front to back, if you have lots of overdraw. If you have HUGE amount of overdraw, use the two-phase occlusion cull described in page 53 of this SIGGRAPH 2015 presentation: http://advances.realtimerendering.com/s2015/aaltonenhaar_siggraph2015_combined_final_footer_220dpi.pdf

### stevesan commented Feb 18, 2018

 hello! so where do you get the sphere centers from?

### sebbbi commented Feb 19, 2018 • edited

 In my case I have a raw buffer written by my GPGPU simulators. I use this technique for debug views of SPH fluids and PBD physics simulation. In DirectX, you can use one of the following: ``````Buffer spheres; ByteAddressBuffer spheres; StructuredBuffer spheres; `````` Store sphere position to xyz and radius to w. SV_VertexId % 4 gives you the index to address the sphere buffer.

### alexsr commented May 12, 2018

 Hello. Could you elaborate on the way you calculate the rays and possibly the ray origin? I get the vertex shader to work to the point where I can render oriented quads, but I'm struggling with implementing the pixel shader. Thank you for compiling this guide btw.