250 likes | 266 Views
This paper explores acceleration techniques for GPU-based volume rendering, including early ray termination, empty space skipping, and a high-quality GPU raycaster.
E N D
Motivation Properties of real data sets Surface like structures Surface illumination Images courtesy of Joe Kniss and volren.org Occlusions
only 2% of all fragments visible Motivation Texture based volume rendering today: Hardware accelerated renderingof totally invisible structures
Our Contribution We use new GPU Features to: • Discard invisible fragments • early ray termination • empty space skipping • Implement a high quality GPU Raycaster • Accelerate the Raycaster
Our Toolkit Programmable graphics hardware • “Arbitrarily” programmable shaders • Assembly language • High level languages • 32 Bit-Floating-point processing • Input: fp32 textures • Arithmetic: fp24-fp32 • Output: fp32 render targets • Early Z-Test • Multiple dependent texture fetches
Our Toolkit Stream Architecture Geometry Rasterizer Fragments User Textures … Early Z-Test … Fragment Shader … Render Texture
Raycaster Slicing (SBVR) vs. GPU-Raycaster (RC) SBVR render proxy geometry (slices) RC render proxy geometry (faces)
Raycasting Using only one main pass for Raymarching
Basic Idea Multi-pass approach • Generate entry point • first hit in local texture coordinates • Compute ray direction • ray direction in local texture coordinates • Ray Marcher (simplified) • Main pass (Ray traversal) • Intermediate pass (Stopping criterion)
Entry Point • Render into 2D texture • Front faces of the volume bounding box • Texture coordinates as color components (0,1,0) (1,1,1) (0,0,1) (1,0,0) (1,0,1)
(0,1,0) (1,1,1) subtract (0,0,1) (1,0,0) (1,0,1) Ray Direction • render into second texture • back faces of the bounding box • subtract from entry-point texture to get ray direction (0,1,0) (0,0,0) (0,0,1) (1,0,0) (1,0,1)
Basic Idea Multi-pass approach • Generate entry point • first hit in local texture coordinates • Compute ray direction • ray direction in local texture coordinates • Ray Marcher • Main passes (Ray traversal) • Intermediate pass (Stopping criterion)
Raycasting Using multiple Raymarching passes
Ray Marcher (Main passes) We know: Entry point and ray direction Render front-faces • set Color like before C • set Texture coords to NDC (x,y) • activate direction texture DIR • a global counter t compute ray as: r(t)=C+t*DIR(x,y) float3 fDirection = tex2D(sDirection, v.TexCoords.rg).rgb; float3 fFrontVal = v.Color.rgb; float3 fVolCoord = fFrontVal+fDepth*fDirection;
Ray Marcher (Main passes) Integration along the ray • use r(t) to access the volume • integrate over multiple steps (N) • combine with frame buffer contents [..] for (int i=0;i<N;i++) { fResultVal = under(tex3D(sVolume, fVolCoord),fResultVal); fVolCoord += fStepSize*fDirection; } return fResultVal;
Raycasting Acceleration techniques Raycasting Early Ray Termination Empty Space Skipping
Acceleration Techniques Terminate Rays on one of the following conditions: • it has left the volume • it has reached a certain opacity Suspend a ray if: • it‘s traversing an empty region this needs to be done on a per-fragment basis early Z-Test
Acceleration techniques Early-Z Restrictions: • on current GPUs early Z-Test only works if • no clip or texkill operation is executed • the Z-value is not changed in the shader • the raymarching shader can not terminate himself • Solution: use intermediate pass to do the ray-suspending/terminating
Acceleration techniques • Execute intermediate pass after every main pass(= N volume samples) • Access z-value only in this pass • If ray is terminated or suspended set z-value before main-pass-geometry • Reset depth behind it if ray is to be resumed
Ray Marcher (intermediate pass) for early ray termination : check accumulated alpha for empty space skipping : check “skip-volume” Skip volume: • volume sampled down to 1/8 in every dimension • every sample contains the minimum and maximum of the 512 corresponding entries Check Texture: • 2D lookup texture • lookup(x,y)=1 iff all values between x and y are 0 under the current transfer function
Ray Marcher (intermediate pass) for early ray termination : check accumulated alpha for empty space skipping : check “skip-volume” float4 fLastVal = tex2D(sLastFrame, v.TexCoords.rg); float3 fDirection = tex2D(sDirection, v.TexCoords.rg).rgb; float3 fFrontVal = v.Color.rgb; float3 fVolCoord = fFrontVal+fDepth*fDirection; float2 fMaxMin = tex3D(sEmptySpace, fVolCoord).rg; float fEmpty = tex2D(sEmptyLookUp, fMaxMin); OUT.depth = ((fLastVal.a < 0.9999) && (fEmpty<1)) ? 0 : 100; OUT.col = fLastVal; return OUT;
DEMOS Run on • Intel Pentium IV 2.4GHz • ATI Radeon 9800 Pro. • Microsoft Windows XP • DirectX 9 • Pixel/Vertex Shader 2.0
Iso-Surface Raycasting • first 2 passes and intermediate passes remain unchanged • global traversal order still front to back • order within the main shader is back to front • keep only last isovalue • if isovalue was found computeillumination with 3D gradienttexture and write it to thefinal image
Conclusion Using current GPU features we showed how to • Discard invisible fragments • early ray termination • empty space skipping • Implement a high quality GPU Raycaster • Accelerate that Raycaster
The End Thank you! Questions? Download Slides at: http://wwwcg.in.tum.de/Research/Publications/Raycast/