Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 10 лет назад пользователемМарта Выгодская
2 Practical Metaballs and Implicit Surfaces Yury Uralsky NVIDIA Developer Technology
3 Agenda The idea and motivation Implementation details Caveats & optimizations Where to go from here Conclusion
4 What are isosurfaces? Consider a function Defines a scalar field in 3D-space Isosurface S is a set of points for which can be thought of as an implicit function relating x, y and z Sometimes called implicit surfaces
5 What are isosurfaces? can come from Scattered data array Mathematical formula Isosurfaces are important data visualization tool Medical imaging Science visualization Hydrodynamics Cool effects for games!
6 Metaballs A particularly interesting case Use implicit equation of the form Gradient can be computed directly Soft/blobby objects that blend into each other Perfect for modelling fluids T1000-like effects
7 Metaballs are cool!
8 The marching cubes algorithm A well-known method for scalar field polygonization Sample f(x, y, z) on a cubic lattice For each cubic cell… - Estimate where isosurface intersects cell edges by linear interpolation - Tessellate depending on values of f() at cell vertices
9 The marching cubes algorithm Each vertex can be either inside or outside For each cube cell there are 256 ways for isosurface to intersect it Can be simplified down to 15 unique cases
10 Geometry shaders in DX10 Geometry Shader Vertex Shader RasterStream Out Pixel Shader To Framebuffer From CPU Triangles with adjacency Lines with adjacency
11 Implementation - basic idea App feeds a GPU with a grid of vertices VS transforms grid vertices and computes f(x, y, z), feeds to GS GS processes each cell in turn and emits triangles Calculate f(x, y, z) Extract Iso-surface Shade surface Vertex shader Geometry shader Pixel shader CPU
12 A problem… Topology of GS input is restricted - Points - Lines - Triangles - with optional adjacency info Our primitive is a cubic cell Need to input 8 vertices to a GS A maximum we can input is 6 (with triangleadj)
13 Solution First, note that actual input topology is irrelevant for GS E.g. lineadj can be treated as quad input Work at tetrahedra level Tetrahedron is 4 vertices - perfect fit for lineadj! Well subdivide each cell into tetrahedra
14 Marching Tetrahedra (MT) Tetrahedra are easier to handle in GS No ambiguities in isosurface reconstuction Always output either 1 or 2 triangles
15 Generating a sampling grid Theres a variety of ways to subdivide Along main diagonal into 6 tetrahedra – MT6 Tessellate into 5 tetrahedra – MT5 Body-centered tessellation – CCL Can also generate tetrahedral grid directly AKA simplex grid Doesnt fit well within rectilinear volume
16 Sampling grids MT5 MT6 CCL
17 Sampling grids comparison Generation Complexity Sampling effectivene ss Regularity MT5Med Low MT6LowMedLow CCLHigh Med SimplexLowMedHigh
18 VS/GS Input/output // Grid vertex struct SampleData { float4 Pos : SV_POSITION;// Sample position float3 N : NORMAL;// Scalar field gradient float Field : TEXCOORD0;// Scalar field value uint IsInside : TEXCOORD1;// Inside flag }; // Surface vertex struct SurfaceVertex { float4 Pos : SV_POSITION;// Surface vertex position float3 N : NORMAL;// Surface normal };
19 Vertex Shader // Metaball function // Returns metaball function value in.w // and its gradient in.xyz float4 Metaball(float3 Pos, float3 Center, float RadiusSq) { float4 o; float3 Dist = Pos - Center; float InvDistSq = 1 / dot(Dist, Dist); o.xyz = -2 * RadiusSq * InvDistSq * InvDistSq * Dist; o.w = RadiusSq * InvDistSq; return o; }
20 Vertex Shader #define MAX_METABALLS32 SampleData VS_SampleField(float3 Pos : POSITION, uniform float4x4 WorldViewProj, uniform float3x3 WorldViewProjIT, uniform uint NumMetaballs, uniform float4 Metaballs[MAX_METABALLS]) { SampleData o; float4 Field = 0; for (uint i = 0; i 1 ? 1 : 0; return o; }
21 Geometry Shader // Estimate where isosurface intersects grid edge SurfaceVertex CalcIntersection(SampleData v0, SampleData v1) { SurfaceVertex o; float t = (1.0 - v0.Field) / (v1. Field - v0.Field); o.Pos = lerp(v0.Pos, v1.Pos, t); o.N = lerp(v0.N, v1.N, t); return o; }
22 Geometry Shader [MaxVertexCount(4)] void GS_TesselateTetrahedra(lineadj SampleData In[4], inout TriangleStream Stream) { // construct index for this tetrahedron uint index = (In[0].IsInside
23 Edge table construction const struct { uint4 e0; uint4 e1; } EdgeTable[] = { // … { 3, 0, 3, 1, 3, 2, 0, 0 },// index = 1 // … }; Index = 0001, i.e. vertex 3 is inside
24 Geometry Shader // … continued // don't bother if all vertices out or all vertices in if (index > 0 && index < 15) { uint4 e0 = EdgeTable[index].e0; uint4 e1 = EdgeTable[index].e1; // Emit a triangle Stream.Append(CalcIntersection(In[e0.x], In[e0.y])); Stream.Append(CalcIntersection(In[e0.z], In[e0.w])); Stream.Append(CalcIntersection(In[e1.x], In[e1.y])); // Emit additional triangle, if necessary if (e1. z != 0) Stream.Append(CalcIntersection(In[e1.z], In[e1.w])); } }
25 Respect your vertex cache! f(x, y, z) can be arbitrary complex E.g., many metaballs influencing a vertex Need to be careful about walk order Worst case is 4x more work than necessary! Straightforward linear work is not particularly cache friendly either Alternatively, can pre-transform with StreamOut
26 Respect your vertex cache! Can use space-filling fractal curves Hilbert curve Swizzled walk Well use swizzled walk To compute swizzled offset, just interleave x, y and z bits
27 Linear walk vs swizzled walk Linear walkSwizzled walk
28 Tessellation space Object space Works if you can calculate BB around your metaballs View space Better, but sampling rate is distributed inadequately
29 Tessellation in post-projection space View-spacePost-projection space Post-projective space Probably the best option We also get LOD for free!
30 Problems with current approach Generated mesh is over-tessellated General problem with MT algorithms Many triangles end up irregular and skinny Good sampling grid helps a bit
31 Possible enhancements Regularized Marching Tetrahedra (RMT) Vertex clustering prior to polygonization Generated triangles are more regular For details refer to [2] Need to run a pre-pass at vertex level, looking at immediate neighbors For CCL, each vertex has 14 neighbors GS input is too limited for this
32 More speed optimizations Can cull metaballs based on ROI Only 3 or 4 need to be computed per-vertex Can use bounding sphere tree to cull Re-compute it dynamically on a GPU as metaballs move Cool effect idea – particle system metaballs Mass-spring can also be interesting
33 Conclusion DX10 Geometry Shader can be efficiently used for isosurface extraction Allows for class of totally new cool effects Organic forms with moving bulges GPGPU to animate metaballs Add noise to create turbulent fields Terminator2 anyone?
34 References [1] J.Patera, V.Skala Centered Cubic Lattice Method Comparison [2] G.M.Treece, R.W.Prager and A.H.Gee Regularised Marching Tetrahedra: improved iso-surface extraction
35 Questions?
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.