Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

For Microsoft's collaboration platform, see Microsoft Mesh.

A polygon mesh is a collection of vertices, edges and faces that together describe the surface of a 3D object in computer graphics. The faces are flat polygons, most often triangles, that share edges and vertices with their neighbours. In Hugues Hoppe's definition, a triangle mesh is "a piecewise linear surface consisting of triangular faces pasted together along their edges", described by its connectivity (which vertices, edges and faces are adjacent) and by the 3D positions of its vertices.[1] Meshes often also carry appearance data such as colours, normals and texture coordinates, and Hoppe notes that models in computer graphics are often represented using triangle meshes.[1]

In virtual reality (VR) and augmented reality (AR), meshes carry most rendered 3D content, so triangle counts are part of headset performance budgets. Meshes also describe the physical world to AR and mixed reality systems: Microsoft HoloLens, Apple's ARKit and Meta's scene APIs all give applications a triangle mesh of the user's surroundings, which applications use for occlusion, physics and placing virtual objects.[2][3][4]

Reviewed 19 October 2026. Checked every cited paper (full text or abstract, plus Crossref DOI metadata) and every Microsoft, Apple, Meta, Unity, Epic, Khronos, OpenUSD, CGAL and Library of Congress documentation claim against the cited pages. About review dates.

Structure

A mesh has three kinds of element. Vertices are points in 3D space; edges are line segments joining two vertices; faces are polygons bounded by a closed loop of edges. File formats such as Wavefront OBJ and OpenUSD allow faces with more than three vertices, but many processing algorithms assume triangles. In their 1997 paper on mesh simplification, Michael Garland and Paul Heckbert note that assuming triangles "implies no loss of generality, since every polygon in the original model can be triangulated as part of a preprocessing phase".[5] They also recommend that faces meeting at a point share a single vertex rather than two separate vertices that happen to be coincident in space.[5]

Beyond geometry, a mesh can hold appearance attributes. Hoppe divides them into discrete attributes, usually attached to faces, such as a material identifier, and scalar attributes such as colour, normal and texture coordinates. Scalar attributes are often stored per corner (a vertex and face pair) rather than per vertex, so that a vertex on a sharp crease can have a different normal on each side.[1]

Face orientation matters for rendering. The order in which a triangle's vertices are listed (its winding order) determines which side is the front, and renderers use it for back-face culling. Microsoft documents that HoloLens spatial mapping meshes use a front-clockwise winding order, with the front side matching the visible side of the real surface.[2] The glTF 2.0 specification defines winding order as "the relative order in which vertices are defined within a triangle" and uses it to classify each triangle as front-facing or back-facing.[6]

Data structures

Indexed face lists

The most common storage scheme keeps an array of vertex positions and, for each face, a list of indices into that array. Microsoft notes that the index and vertex data of a spatial mapping mesh use "the same familiar layout" as the vertex and index buffers "used for rendering triangle meshes in all modern rendering APIs", with each triangle given by three vertex indices.[2] Pixar's OpenUSD stores a mesh as a points array, a flat faceVertexIndices list and a companion faceVertexCounts array giving the number of vertices in each face; its documentation states that "no additional connectivity information is required or constructed, so no adjacency or neighborhood queries are available".[7]

Index size limits mesh size in some engines. Unity's Mesh.indexFormat documentation states that a 16-bit index buffer supports up to 65,535 vertices in a mesh and a 32-bit buffer up to 4 billion, that 16 bit is the default because it uses less memory and bandwidth, and that GPU support for 32-bit indices is not guaranteed on every platform (Android devices with a Mali-400 GPU do not support them).[8]

Edge-based structures

An indexed list on its own does not record which faces and edges are adjacent; OpenUSD, for example, offers no adjacency queries on its meshes.[7] Edge-based structures store this connectivity explicitly. Bruce G. Baumgart described the winged-edge polyhedron representation in Stanford Artificial Intelligence Laboratory memo AIM-179 (October 1972), together with a set of primitives that preserve Euler's F-E+V=2 relation.[9] In his paper "A Polyhedron Representation for Computer Vision" for the 1975 National Computer Conference, each edge record points to its two faces and two vertices and to its four neighbouring edges clockwise and counterclockwise, which Baumgart called "the wings of the edge".[10]

D. E. Muller and F. P. Preparata introduced the doubly connected edge list (DCEL) in a 1978 paper on intersecting convex polyhedra. Each edge node holds the edge's origin and terminus vertices, the faces to its left and right, and two pointers to the next edge counterclockwise around each endpoint, so that both the edges around a vertex and the edges around a face can be traversed.[11] The halfedge data structure used by geometry libraries splits each edge into "two halfedges with opposite orientations"; each halfedge references the next halfedge and its opposite, and optionally its incident vertex and face. The CGAL manual by Lutz Kettner notes that the structure is also known as the FE-structure or DCEL (although the original DCEL reference describes a different structure) and that its variant is restricted to orientable 2-manifolds.[12]

Creating meshes

Artists build meshes directly in 3D modeling software, or convert other surface types into them. Hoppe notes that models built from extrusion, constructive solid geometry and freeform deformation "must usually be tessellated into polygonal approximations" for efficient display, and that detailed meshes are also obtained by scanning physical objects with range scanners.[1] E. Catmull and J. Clark's 1978 subdivision method works in the other direction: it generates smooth surfaces from a control mesh "of arbitrary topology", reproducing a standard B-spline surface for rectangular control meshes and differing from one only at a small number of extraordinary points.[13] OpenUSD meshes are treated as Catmull-Clark subdivision surfaces by default, so a plain polygonal mesh has to be declared explicitly.[7]

From volumes

William E. Lorensen and Harvey E. Cline of General Electric presented marching cubes at SIGGRAPH 1987, an algorithm that "creates triangle models of constant density surfaces from 3D medical data" such as CT, MR and SPECT scans. It examines one cube of eight neighbouring samples at a time; because each corner is either inside or outside the surface there are 28 = 256 cases, which the authors reduced by symmetry to 14 patterns stored in a lookup table of triangle topologies.[14]

From scans and point samples

3D scanning and photogrammetry produce depth maps or point clouds that must be turned into a surface. Hoppe and colleagues at the University of Washington described a 1992 algorithm that takes an unorganized set of points on or near an unknown surface and outputs a simplicial surface approximating it, inferring topology, boundaries and geometry from the data.[15] Brian Curless and Marc Levoy's 1996 volumetric method merges aligned range images into a cumulative weighted signed distance function on a voxel grid and extracts the final surface as an isosurface; they reported models of up to 2.6 million triangles built from as many as 70 range images.[16] Michael Kazhdan, Matthew Bolitho and Hoppe's Poisson surface reconstruction (2006) treats reconstruction from oriented points as a spatial Poisson problem: it computes an indicator function that is 1 inside the model and 0 outside, then extracts an isosurface.[17]

The same volumetric idea moved into real time with KinectFusion, presented at the IEEE International Symposium on Mixed and Augmented Reality (ISMAR) in 2011. It fuses depth data from a moving Kinect into a volumetric truncated signed distance function using commodity GPU hardware. The authors list two ways to view such a model: extracting the surface with a marching cubes type algorithm and rasterising it, or raycasting the distance function directly; their system raycasts the function to predict the surface for tracking.[18]

Simplification and level of detail

Scanned and modelled meshes often contain far more triangles than a renderer can afford. Mesh simplification replaces them with approximations that look nearly the same. Garland and Heckbert's quadric error metric algorithm (SIGGRAPH 1997) repeatedly contracts vertex pairs and tracks the accumulated geometric error at each vertex with a quadric matrix that needs 10 floating-point numbers per vertex. Because it can contract pairs that are not joined by an edge, it can merge unconnected parts of a model. The authors reported producing a 100-face approximation of a 70,000-face model in 15 seconds.[5]

Hoppe's progressive mesh representation (SIGGRAPH 1996) stores a coarse base mesh followed by a sequence of vertex split records. Each vertex split is the inverse of an edge collapse, so applying them in order restores the original mesh exactly. The representation was designed for smooth geomorphs between level of detail approximations (avoiding visible "popping"), progressive transmission, compression and selective refinement.[1] Mesh repair, smoothing, parameterization, remeshing and simplification are covered at textbook length in Polygon Mesh Processing by Mario Botsch, Leif Kobbelt, Mark Pauly, Pierre Alliez and Bruno Lévy (A K Peters/CRC Press, 2010).[19][20]

Some engines now automate level of detail inside the renderer. Epic Games describes Nanite in Unreal Engine 5 as a virtualized geometry system with its own internal mesh format; on import, meshes are split into hierarchical clusters of triangle groups that are swapped at different levels of detail depending on the camera view. The Unreal Engine 5.8 documentation lists "Stereo rendering for Virtual Reality" among Nanite's unsupported rendering features.[21]

File formats

Format Mesh storage Notes
Wavefront OBJ Plain text: vertex positions (v), optional normals (vn) and texture coordinates (vt), and faces (f) built from them First used by Wavefront Technologies around 1990; materials live in a separate MTL file; the specification also allows freeform curves and surfaces[22]
glTF 2.0 Meshes are arrays of primitives; each primitive references accessors for vertex attributes (POSITION, NORMAL, TANGENT, TEXCOORD_n, COLOR_n, JOINTS_n, WEIGHTS_n) and optionally indices Primitives "correspond to the data required for GPU draw calls"; topology modes include points, lines, triangles, triangle strips and triangle fans (triangles by default); supports morph targets and skinned meshes[6]
OpenUSD (including USDZ) Points array plus faceVertexIndices and faceVertexCounts Encodes both subdivision surfaces and plain polygonal meshes; Catmull-Clark is the default subdivision scheme[7]


Applications in VR and AR

Rendering budgets

Meta's device optimization guidance recommends fewer than 1.5 million triangles per frame and fewer than 200 draw calls on Meta Quest 3 (72 Hz target, 90 Hz recommended), and fewer than 750,000 triangles and 100 draw calls on Meta Quest 2 (72 Hz).[23] Meta's Unity performance guide adds that triangle budgets "fluctuate based on frame-to-frame factors", and that on the headsets' tile-based GPUs a triangle's vertex shader runs three times per tile it covers, so triangles spanning several tiles cost more.[24]

Meshes of the real world

Mixed reality devices reconstruct the user's room as a mesh through spatial mapping. On HoloLens, an application asks a spatial surface observer for data inside bounding volumes and receives spatial surfaces, each a triangle mesh attached to a world-locked coordinate system that appears, changes or disappears as the device learns more about the room. The Spatial Mapping API lets the application choose its level of detail through a "Triangles Per Cubic Meter" parameter, and Microsoft advises requesting the lowest triangle density that will do, since fewer triangles reduce memory use and vertex processing. The documentation describes placement, occlusion, physics, navigation and visualization as common usage scenarios. For occlusion, the room mesh is drawn in a depth-only pass so that holograms behind real surfaces are hidden; meshes used for physics often have few triangles, are watertight and are converted into convex hulls. Microsoft notes that these meshes are not as "clean" as artist-made topology and may need hole filling, removal of floating "hallucinations" left by reflections, bright lights and moving objects, or smoothing. The camera used for spatial mapping sees only 3.1 m in front of the user.[2] On Microsoft HoloLens 2, a static version of the same mesh can also be queried through the Scene Understanding SDK.[2]

Apple added scene reconstruction to ARKit in iOS and iPadOS 13.4. ARKit divides the reconstructed scene into ARMeshAnchor objects, "an anchor for a physical object that ARKit detects and recreates virtually using a polygonal mesh", and keeps refining them, although Apple notes that changes are not meant to appear in real time.[3] Scene reconstruction requires a device with a LiDAR Scanner, such as the fourth-generation iPad Pro.[25] In the ARMeshGeometry format, every three vertices form a triangular face with an outward normal and a classification.[26] Apple's sample code shows the mesh classifying floors, tables, seats, windows and ceilings, flattening the mesh where plane detection finds a plane, letting raycasts hit nonplanar or featureless surfaces such as white walls, and occluding virtual content in RealityKit.[27] On visionOS, the SceneReconstructionProvider supplies MeshAnchor objects, each "a volume of space that contains a mesh of a person's surroundings".[28][29]

Meta's scene mesh is "a low-fidelity, high-coverage artifact which describes the boundary between free and occupied space" in a room, generated automatically during the headset's space setup. Meta's documentation lists it for Meta Quest 3, Meta Quest 3S and the announced Meta VR Glasses, and directs new projects to the Mixed Reality Utility Kit (MRUK) because the older scene actor is deprecated.[4] Its Unity migration guide calls the scene mesh a triangle mesh whose use "comes at a high cost", to be used preferably "only for fast-paced short-lived physics contacts".[30]

Captured objects and people

Photogrammetry tools output textured meshes sized for different uses. Apple's RealityKit Object Capture, which builds a 3D model from a set of photographs and writes a USDZ file, publishes the following triangle budgets for its detail levels; on iOS only the reduced level is supported.[31][32]

Detail level Triangles Estimated file size
Preview fewer than 25,000 about 5 MB
Reduced fewer than 50,000 about 10 MB
Medium fewer than 100,000 about 30 MB
Full fewer than 250,000 about 100 MB
Raw fewer than 30 million Varies

Apple states that raw models are not suitable for use in an AR scene and are meant for export to 3D software.[31]

Face tracking also uses meshes. ARKit's ARFaceGeometry is "a 3D mesh describing face topology" that conforms to the detected face's dimensions, shape and current expression; Apple suggests it for effects such as virtual makeup and as occlusion geometry that hides virtual content behind the user's face.[33] In research on photoreal avatars, Stephen Lombardi, Jason Saragih, Tomas Simon and Yaser Sheikh's deep appearance model (SIGGRAPH 2018) learns a face's vertex positions together with view-specific textures with a variational autoencoder, and the authors describe the system as suited to real-time interactive settings such as VR.[34]

Other representations

Meshes are not the only way to describe 3D content. Point clouds and voxels are common in capture and mapping, and Neural Radiance Fields and Gaussian splatting represent captured scenes without explicit surfaces. Bernhard Kerbl and colleagues' 3D Gaussian splatting (ACM Transactions on Graphics, 2023) represents a scene captured in multiple photos or videos with 3D Gaussians and renders them directly with a visibility-aware splatting algorithm, reaching real-time rates (30 frames per second or more) at 1080p.[35]

See also

References

  1. ↑ 1.0 1.1 1.2 1.3 1.4 Hugues Hoppe (1996-08). "Progressive Meshes". Proceedings of SIGGRAPH 96, pp. 99-108. ACM. doi:10.1145/237170.237216. https://doi.org/10.1145/237170.237216. Retrieved 2026-10-19.
  2. ↑ 2.0 2.1 2.2 2.3 2.4 "Spatial mapping". Microsoft Learn (Mixed Reality documentation). Microsoft. https://learn.microsoft.com/en-us/windows/mixed-reality/design/spatial-mapping. Retrieved 2026-10-19.
  3. ↑ 3.0 3.1 "ARMeshAnchor". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/arkit/armeshanchor. Retrieved 2026-10-19.
  4. ↑ 4.0 4.1 "Scene Mesh (deprecated)". Meta Horizon OS Developers. Meta. https://developers.meta.com/horizon/documentation/unreal/unreal-scene-mesh/. Retrieved 2026-10-19.
  5. ↑ 5.0 5.1 5.2 Michael Garland, Paul S. Heckbert (1997). "Surface Simplification Using Quadric Error Metrics". Proceedings of SIGGRAPH 97, pp. 209-216. ACM. doi:10.1145/258734.258849. https://doi.org/10.1145/258734.258849. Retrieved 2026-10-19.
  6. ↑ 6.0 6.1 "glTF 2.0 Specification (version 2.0.1)". Khronos Registry. The Khronos Group. 2021-10-11. https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html. Retrieved 2026-10-19.
  7. ↑ 7.0 7.1 7.2 7.3 "UsdGeomMesh Class Reference". OpenUSD documentation. Pixar Animation Studios. https://openusd.org/release/api/class_usd_geom_mesh.html. Retrieved 2026-10-19.
  8. ↑ "Mesh.indexFormat". Unity Scripting API (Unity 6.6). Unity Technologies. https://docs.unity3d.com/ScriptReference/Mesh-indexFormat.html. Retrieved 2026-10-19.
  9. ↑ Bruce G. Baumgart (1972-10). "Winged Edge Polyhedron Representation (AIM-179)". Stanford Artificial Intelligence Laboratory Memo AIM-179. Stanford University. https://purl.stanford.edu/tz289cy2950. Retrieved 2026-10-19.
  10. ↑ Bruce G. Baumgart (1975). [NCC,BGB "A Polyhedron Representation for Computer Vision (author's file of the 1975 National Computer Conference paper)"]. SAILDART archive of the Stanford AI Laboratory. doi:10.1145/1499949.1500071. https://www.saildart.org/NCC[NCC,BGB]. Retrieved 2026-10-19.
  11. ↑ D. E. Muller, F. P. Preparata (1978). "Finding the Intersection of Two Convex Polyhedra". Theoretical Computer Science, vol. 7, no. 2, pp. 217-236. North-Holland. doi:10.1016/0304-3975(78)90051-8. https://doi.org/10.1016/0304-3975(78)90051-8. Retrieved 2026-10-19.
  12. ↑ Lutz Kettner. "Halfedge Data Structures". CGAL User and Reference Manual. The CGAL Project. https://doc.cgal.org/latest/HalfedgeDS/index.html. Retrieved 2026-10-19.
  13. ↑ E. Catmull, J. Clark (1978-11). "Recursively generated B-spline surfaces on arbitrary topological meshes". Computer-Aided Design, vol. 10, no. 6, pp. 350-355. doi:10.1016/0010-4485(78)90110-0. https://doi.org/10.1016/0010-4485(78)90110-0. Retrieved 2026-10-19.
  14. ↑ William E. Lorensen, Harvey E. Cline (1987-07). "Marching Cubes: A High Resolution 3D Surface Construction Algorithm". Computer Graphics (SIGGRAPH 87 Proceedings), vol. 21, no. 4, pp. 163-169. ACM. doi:10.1145/37402.37422. https://doi.org/10.1145/37402.37422. Retrieved 2026-10-19.
  15. ↑ Hugues Hoppe, Tony DeRose, Tom Duchamp, John McDonald, Werner Stuetzle (1992-07). "Surface Reconstruction from Unorganized Points". Proceedings of SIGGRAPH 92, pp. 71-78. ACM. doi:10.1145/133994.134011. https://doi.org/10.1145/133994.134011. Retrieved 2026-10-19.
  16. ↑ Brian Curless, Marc Levoy (1996-08). "A Volumetric Method for Building Complex Models from Range Images". Proceedings of SIGGRAPH 96, pp. 303-312. ACM. doi:10.1145/237170.237269. https://doi.org/10.1145/237170.237269. Retrieved 2026-10-19.
  17. ↑ Michael Kazhdan, Matthew Bolitho, Hugues Hoppe (2006). "Poisson Surface Reconstruction". Eurographics Symposium on Geometry Processing 2006, pp. 61-70. The Eurographics Association. doi:10.2312/SGP/SGP06/061-070. https://doi.org/10.2312/SGP/SGP06/061-070. Retrieved 2026-10-19.
  18. ↑ Richard A. Newcombe, Andrew Fitzgibbon, Shahram Izadi, Otmar Hilliges, David Molyneaux, David Kim, Andrew J. Davison, Pushmeet Kohli, Jamie Shotton, Steve Hodges (2011-10). "KinectFusion: Real-time dense surface mapping and tracking". 2011 10th IEEE International Symposium on Mixed and Augmented Reality, pp. 127-136. IEEE. doi:10.1109/ISMAR.2011.6092378. https://doi.org/10.1109/ISMAR.2011.6092378. Retrieved 2026-10-19.
  19. ↑ Mario Botsch, Leif Kobbelt, Mark Pauly, Pierre Alliez, Bruno Levy (2010). "Polygon Mesh Processing". EPFL Infoscience. A K Peters/CRC Press. https://infoscience.epfl.ch/entities/publication/08871574-a657-4a12-93cf-cc7527dbd6ff/bookdetails. Retrieved 2026-10-19.
  20. ↑ "Polygon Mesh Processing". pmp-book.org. https://www.pmp-book.org/. Retrieved 2026-10-19.
  21. ↑ "Nanite Virtualized Geometry in Unreal Engine". Unreal Engine 5.8 Documentation. Epic Games. https://dev.epicgames.com/documentation/en-us/unreal-engine/nanite-virtualized-geometry-in-unreal-engine. Retrieved 2026-10-19.
  22. ↑ "Wavefront OBJ File Format". Sustainability of Digital Formats. Library of Congress. https://www.loc.gov/preservation/digital/formats/fdd/fdd000507.shtml. Retrieved 2026-10-19.
  23. ↑ "Device-specific optimization (Quest 3 vs Quest 2)". Meta Horizon OS Developers. Meta. https://developers.meta.com/horizon/resources/device-optimization-comparison/. Retrieved 2026-10-19.
  24. ↑ "Testing and performance analysis". Meta Horizon OS Developers. Meta. https://developers.meta.com/horizon/documentation/unity/unity-perf/. Retrieved 2026-10-19.
  25. ↑ "supportsSceneReconstruction(_:)". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/arkit/arworldtrackingconfiguration/supportsscenereconstruction(_:). Retrieved 2026-10-19.
  26. ↑ "ARMeshGeometry". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/arkit/armeshgeometry. Retrieved 2026-10-19.
  27. ↑ "Visualizing and interacting with a reconstructed scene". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/arkit/visualizing-and-interacting-with-a-reconstructed-scene. Retrieved 2026-10-19.
  28. ↑ "SceneReconstructionProvider". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/arkit/scenereconstructionprovider. Retrieved 2026-10-19.
  29. ↑ "MeshAnchor". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/arkit/meshanchor. Retrieved 2026-10-19.
  30. ↑ "Migrating from OVRSceneManager to MRUK". Meta Horizon OS Developers. Meta. https://developers.meta.com/horizon/documentation/unity/unity-scene-migrate-mruk. Retrieved 2026-10-19.
  31. ↑ 31.0 31.1 "PhotogrammetrySession.Request.Detail". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/realitykit/photogrammetrysession/request/detail. Retrieved 2026-10-19.
  32. ↑ "Creating 3D objects from photographs". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/realitykit/creating-3d-objects-from-photographs. Retrieved 2026-10-19.
  33. ↑ "ARFaceGeometry". Apple Developer Documentation. Apple. https://developer.apple.com/documentation/arkit/arfacegeometry. Retrieved 2026-10-19.
  34. ↑ Stephen Lombardi, Jason Saragih, Tomas Simon, Yaser Sheikh (2018). "Deep Appearance Models for Face Rendering". ACM Transactions on Graphics, vol. 37, no. 4, article 68. doi:10.1145/3197517.3201401. https://doi.org/10.1145/3197517.3201401. Retrieved 2026-10-19.
  35. ↑ Bernhard Kerbl, Georgios Kopanas, Thomas Leimkühler, George Drettakis (2023-07). "3D Gaussian Splatting for Real-Time Radiance Field Rendering". ACM Transactions on Graphics, vol. 42, no. 4. doi:10.1145/3592433. https://doi.org/10.1145/3592433. Retrieved 2026-10-19.