Building upon our prior analysis of the single-pixel UV ellipse, this note examines the geometric illusion of depth. Rather than introducing a novel sampler, we offset UV coordinates along the tangent-space view ray to simulate volumetric depth on a planar two-triangle quad. The integration of interior parallax and an optional height-field self-shadowing routine closely mimics true geometric displacement. This approach, however, faces a strict physical limitation: the mesh outline remains invariant. Ultimately, the silhouette is still the quad.

Under identical lighting conditions, we observe three distinct rendering regimes across the same brick geometry. Standard rendering utilizing geometric and base UV (FLAT) produces a painted-card effect where mortar wells remain persistently visible regardless of the incident vector. Applying height-derived normals at the geometric UV (BUMP) yields accurate shading, yet the brick elements lack perspective shift as the view angle changes. Conversely, Parallax Occlusion Mapping (POM) employing an roof-hull march achieves correct perspective translation, naturally occluding the mortar within the wells. Note that this visual comparison relies strictly on photographic evaluation rather than formal UV-error metrics.

At severe grazing angles, POM produces a striking depth illusion; however, we emphasize that it remains unequivocally a texture-space offset rather than true geometric displacement.

We quantify this structural limitation by comparing a CPU-displaced grid against the POM-mapped quad. The displaced grid physically alters the mesh outline, extending beyond the basal plane. In contrast, the POM quad remains structurally planar. Highlighting this coverage discrepancy yields , resulting in a fractional difference of . An Axis-Aligned Bounding Box (AABB) span of verifies the true geometric extrusion of the reference grid, proving it left the basal plane. Thus, while interior pixels exhibit highly accurate POM intersections, the screen-space coverage cannot organically expand beyond the underlying triangles.
Our primary evaluation configuration fixes the displacement parameters to establish a strict benchmark. The baseline locks the scale at with a bias of , utilizing an R32F height map evaluated via Mesa 25.0.7 llvmpipe.
| Metric | Configuration | Value |
|---|---|---|
| MAE (Face-on) | Bump vs. POM | |
| Analytic UV Error | , indent | |
| Analytic UV Error | , indent | |
| Coverage XOR | Displaced floor vs. POM quad | |
| Validation Suite | Internal regression status | 28 pass / 0 fail |
Scene
The primary stimulus for these tests is a CPU-authored running-bond brick texture ( POT, REPEAT wrapping). It follows the roof convention, where a normalized height is flush with the bounding mesh and defines the maximum carved recess. For precise analytic validation, we employ a spherical indent (CLAMP_TO_EDGE) alongside a 1-D cosine ridge. The physical material is characterized as procedural clay, featuring per-brick variations, grog, and striae. This ensures the UV sliding behavior contains sufficient high-frequency detail for observational analysis, deliberately avoiding the inherent noise of standard photogrammetry scans.

As observed above, interior parallax establishes the illusion of sliding geometry well before reaching extreme grazing angles. This remains a photograph-only assessment.
The rendering behavior operates across two distinct angular regimes that must remain strictly isolated:
- Face-on (, ): The computed UV offset approaches . In this orientation, standard bump mapping, offset mapping, steep parallax, and POM must converge perfectly, utilizing identical normals and UV coordinates. Our baseline confirms . Any implementation presenting depth disparity at a face-on angle typically suffers from an inverted TBN matrix or an erroneous residual offset.
- Graze (): At this extreme, interior parallax delivers robust volumetric occlusion, yet the discrepancy between the planar silhouette and the mathematically displaced mesh exposes the fundamental limitation of the technique. Undersampling the height field ( too low) in this regime directly induces texture swimming.
Crucially, a software rasterizer does not require animation to expose sampling flaws. Texture swimming in a static, locked pose manifests as spatial banding and skipped mortar wells. Furthermore, the silhouette failure becomes starkly evident when a perfectly linear polygonal edge bounds a seemingly complex, displaced interior profile.
Fundamentally, standard height maps cannot represent overhangs, as they are restricted to 2D functions . Any perceived self-occlusion strictly indicates that a given ridge blocks a corresponding recess along the active view ray, rather than representing a volumetric cave or true geometric undercut.
Method
Why: TBN, , POM lerp
TBN and tangent-space view
To correctly warp the UV coordinates, we require an orthonormal tangent frame evaluated at the fragment, with columns defined in world space. We enforce a strictly right-handed coordinate system, ensuring .
The TBN matrix employed in this analysis is rigorously generated on the CPU, derived either directly from the quad or the displaced-grid vertex. This guarantees it matches the exact matrix supplied to the shader as vertex attributes. We must not rely on an llvmpipe dFdx calculation of the world position to construct a precision tangent frame.
For front-face evaluation, the condition must hold. If , the view ray points away from the surface, and the march is immediately discarded.
Height convention (roof default)
By default, the geometric quad serves as the outer hull, positioned at a normalized height of . The sampled texture defines the structural elevation: denotes a surface flush with the hull, while indicates the deepest recess.
Here, represents a height bias, which is fixed at for the duration of this analysis. The scale factor governs the physical extrusion range, measured relative to the quad’s -edge world length. Our baseline metric configuration requires . The required lateral UV translation necessary to account for a unit change in normalized height is defined as:
Proud-brick silhouette control: We define a secondary reference mesh stationed at the floor (height ), with individual bricks geometrically extruded outward to , utilizing the identical scale . This geometry establishes the true, physical silhouette that should organically emerge under POM, but mathematically does not.
When handling ray misses: if the cast ray traverses the entire internal volume without intersecting the height field, we fallback gracefully and sample the floor plane at .
Ray in the height volume
The ray origin is situated at the geometric hit location on the roof (), corresponding to the initial UV coordinate . The parameter defines the normalized depth driven into the volume, directly mapping to the drop in height:
A confirmed intersection occurs at the smallest value of satisfying the inequality .
Offset mapping — named knife, not hero
In true parallax mapping (Kaneko-style), which evaluates a single sample, the UV perturbation is formulated as:
Traditional offset limiting (often associated with Welsh) intentionally omits the term, yielding a modified offset vector where . At severe grazing angles, the true single-sample offset explodes into visual incoherence, whereas the limited offset systematically under-walks the surface profile. While both historical methods warrant inclusion in the comparative family strip for context, neither represents the modern standard technique.
Steep parallax — even layers, first crossing
Steep parallax mapping discretizes the bounding volume into uniform strata:
An intersection is identified at the smallest layer index where the ray plane descends below the height surface: . This process inherently produces a mathematical staircase artifact in . Our primary testing configuration employs a fixed step count of , while enforcing a strict compile-time upper bound of .
POM — linear search + secant lerp (hero)
After isolating the first height-field crossing between layers and , POM refines the intersection precision by interpolating the exact root of . This derivation assumes both functions exhibit linearity with respect to across the sampled interval:
We emphasize that this is exclusively a secant step executed on the bounding samples; it is not an analytically exact ray–height intersection unless the underlying height map is strictly linear between those UV coordinates. Relief mapping (which executes binary bisections after isolating the initial crossing) is supported within our backend architecture but is intentionally excluded from the primary family strip comparison. Conversely, the coarse ladder clearly illustrates how an insufficient linear search can erroneously step over narrow geometric features, such as a mortar well.
Sampling the height inside the march
When implementing the marching loop, one must not rely on standard texture() fetches. Because the iteration count diverges significantly across adjacent fragments, computing implicit derivatives within the loop is fundamentally illegal. Instead, the LOD must be provided explicitly:
We enforce two strictly controlled values for our analyses:
- : This maintains distinct, sharp mortar wells but induces aggressive aliasing when the texture is minified at a distance.
- : This is derived precisely from the geometric UV Jacobian (CPU , employing the exact formulation standard mipmaps or anisotropic filtering utilize). Under this specific LOD, structural relief visibly degrades, and fine self-occlusion details are lost.
Do not assert that this method calculates an accurate along-ray cone LOD. Upon determining , we sample the albedo at and compute the local normal by evaluating the central differences of the height map precisely at the intersection coordinate.
Self-shadow (second march, not a shadow map)
To simulate self-shadowing, we launch a secondary ray marching from directly toward the incoming light vector in tangent space, constrained by the identical roof/floor bounding volume. If any subsequent sample along this trajectory evaluates below the height field before exiting the volume, the fragment is classified as occluded. A simple binary evaluation (any intersection equals shadow) serves as our default mechanism. This technique is strictly in-family to parallax mapping; it must not be conflated with shadow-map bias, PCF filtering, or standard glPolygonOffset implementations.
Silhouette predicate (the lie, as a formula)
To mathematically formalize the visual discrepancy inherent in POM, let denote the absolute screen-space coverage of the base 2-triangle geometric wall. POM can only evaluate and shade fragments where . Conversely, let represent the true rasterized coverage of a highly tessellated, physically displaced mesh utilizing identical height data.
While modulating gl_FragDepth based on the derived intersection distance can correctly handle interior depth compositing for subsequent post-processing, it fundamentally cannot expand the rasterized outline of the underlying mesh. Our operational policy is rigid: do not write gl_FragDepth, and the current validation run strictly adheres to this constraint.
Unique artifacts: the slice, then the XOR

The preceding diagram illustrates the precise geometric artifact this investigation targets. Evaluated via a rigorous CPU-side model, independent of the OpenGL rasterization pipeline, we map a 1-D cosine ridge against the incident view ray intersecting discrete layer planes.
- Primary Validation: At , the steep parallax first-hit approximation, the POM secant interpolation, and the dense-1D true intersection strictly converge on the same first ridge (denoted by the nested intersection rings). The dense-1D root isolation resolves at , POM converges closely at , while the steep step approximation lands at .
- Inset Failure: The inset demonstrates a deliberately induced skipped well. Analytically, the true intersection remains on ridge 1; however, both the steep and POM evaluations cross the bounding strata without triggering a hit, erroneously skipping to ridge 2. This aliasing at low layer counts is not indicative of a fundamentally flawed algorithm; rather, it is the exact mathematical mechanism driving the texture swimming artifact observed at lower rungs of the -ladder.



To rigorously quantify UV error, we evaluate against a spherical indent instrument parameterized with radius , centered at , enforcing wrap clamp rules, and restricting analysis strictly to the indent interior. The resulting heatmap visualizes the deviation vector magnitude: . Regions outside the defined rim constitute the planar roof (); consequently, a raw quadratic sphere formula miss does not correspond to a valid height-field intersection and is explicitly excluded from the mean error calculation.
Discussion
Family, then the ladders



What-if controls
What if: Face-on: POM must not invent depth

When the incident view vector aligns precisely with the surface normal () across the exact same bounding roof hull, the theoretical UV deviation is zero. The rigorous analytical validation for this is an orthographic UV-grid calculation yielding the Mean Absolute Error (MAE), independent of any perspective projection artifacts. This control confirms . The included photograph inevitably captures microscopic edge parallax due to standard perspective projection; it is provided as a visual corroboration of the control environment, not as a source for secondary quantitative metrics. If a POM implementation exhibits spurious depth or distortion under face-on orthographic evaluation, validating the TBN matrix handedness should be the immediate priority.
What if: Scale / bias
A scale factor of is mathematically equivalent to standard bump mapping, as it dictates zero UV translation. Our designated baseline scale of strikes an optimal balance, providing robust, readable interior parallax across the target brick asset. Increasing the scale to forces the view ray to intersect too many repeating tiles per unit of parametric depth : the initial ray crossing erroneously intersects adjacent architectural features, rays prematurely terminate on the volume floor, and the entire surface exhibits severe texture swimming. The bias parameter remains strictly locked at .
What if: Too few steps
Executing the height march with only layers critically undersamples deep structural wells, inducing massive staircasing artifacts that serve as a highly visible spatial proxy for dynamic texture swimming. Increasing the sample density to completely resolves these artifacts under the identical pose. The previously discussed 1-D march-slice featuring the inset is a direct mathematical formalization of this exact undersampling failure; it is explicitly documented as an intentional failure mode, ensuring it is not misinterpreted as a flaw in the baseline POM algorithm.
What if: Self-occlusion is a second height march

The image sequence above delineates the boundaries of self-shadowing evaluation. In the left frame, utilizing only the primary view-march, physically occluded structural wells erroneously receive full unshadowed shading because the view intersection is successful while the incident light vector is ignored. The middle frame introduces the secondary tangent-space light-march, which correctly occludes contact points and deep recesses. The right frame provides the displaced-mesh ground truth, utilizing true triangulated geometry mapped to the identical height field. As emphasized in the caption: this technique is not a shadow map. The reported shadow agreement metric of is derived explicitly by comparing an march against a denser march operating on the same continuous height field; it is not a comparison against ray-traced geometric triangles. This agreement metric must not be quoted as a validation of true geometric matching.
What if: Height LOD — one sentence of Jacobian

When the surface is minified under perspective projection, the CPU calculates the geometric UV Jacobian as , which dictates an isotropic Level of Detail (LOD) of . On the left, clamping to preserves the high-frequency structural definition of the mortar wells but introduces severe sub-pixel aliasing. On the right, applying causes the high-frequency relief to visibly soften and melt. This methodology guarantees perfect continuity with standard hardware mipmapping and anisotropic filtering: it applies an isotropic LOD derived entirely from the geometric UV footprint, deliberately ignoring complex along-ray cone expansion calculations. This represents standard industry practice, not a novel rendering theorem, and we intentionally omit extensive Anisotropic Filtering quality analyses.
What if: Offset leaves the tile

When a view ray extends beyond the primary texture boundary, a periodic material should organically walk into the adjacent repeating tile; enforcing a strict coordinate clamp instead flattens the boundary into an unnatural rim artifact. This remains an observation supported strictly by visual photographic evidence.

Limits
What this box actually measured
To ensure stringent experimental reproducibility, the host environment for these evaluations was OSMesa, executing Mesa 25.0.7-2+deb13u1, utilizing the llvmpipe software driver (LLVM 19.1.7, 256-bit vectors). The framebuffer target was strictly configured as RGBA32F, with height map textures constrained to R32F. The 8-bit fallback path was not hit during any phase of testing, and both sRGB conversion and MSAA were deliberately disabled. The depth buffer (gl_FragDepth) was not written. The primary brick texture utilized REPEAT wrapping, whereas the spherical indent instrument employed CLAMP_TO_EDGE. Our automated regression suite confirmed 28 pass / 0 fail, mathematically validating that the TBN matrix remained perfectly orthonormal and right-handed. The suite verified that , confirmed that the displaced mesh AABB span was correctly (measured at 0.1415), proved the analytic UV error monotonically decreased as increased (), established the face-on MAE precisely at , and confirmed the grazing profile (measured at 0.575).
We formalize the following claims: operating within this specific OSMesa / llvmpipe environment, a rigorous CPU tangent-space height march evaluated against an authored field successfully offsets UV coordinates along a precisely known vector . This technique systematically reduces measurable UV error compared to an analytic sphere as the layer count increases, up to the inherent saturation point of the linear-search / secant interpolation model. Implementing a GLSL 330 fragment march, bounded by a fixed step cap and relying on explicit textureLod fetches, yields what is fundamentally a photograph of this specific software rasterizer. It must not be misconstrued as an evaluation of a discrete GPU’s dedicated POM hardware unit (as no such specialized fixed-function hardware exists). Under perfectly face-on orthographic projection, bump mapping and POM exhibit flawless parity along our scientific evaluation path (). At severe grazing angles, the true screen-space coverage of the physically displaced grid fiercely contradicts the visual output of the planar 2-triangle POM quad; this resulting XOR delta completely quantifies the silhouette lie. Finally, implementing a secondary tangent-space height-field light-march convincingly occludes structural wells that the primary view ray fails to hide, but this methodology remains strictly a ray march, not a true hardware shadow map.
We explicitly disclaim any evaluation of NVIDIA, AMD, or Intel hardware POM implementations, nor do we attempt to quantify hardware tessellation efficiency or assert that "AAA games execute exactly this many taps." We make no claims regarding the performance parity of our specific llvmpipe loop against modern GPU architectures, justifying the omission of millisecond frame timings. We cannot assert that a shader utilizing dFdx/dFdy to construct a TBN matrix, or relying on implicit LOD calculations within a dynamic loop, will precisely match dedicated hardware behavior. We do not claim that the standard POM secant interpolation is a perfect analytic ray–height intersection. We reject the notion that writing gl_FragDepth from the fragment shader magically "fixes" the absence of true geometric displacement—the absolute screen-space coverage is, and always will be, bottlenecked by the base primitive quad. Most critically, we reiterate that a height field is not actual geometry.
Honesty, short:
- Metrics are CPU evaluated exclusively on high-precision float height data. The presented grazing shots, brick-hero panels, and self-shadow wall comparisons serve as high-fidelity photographs of this specific software rasterizer. Do not irresponsibly cite these qualitative images as quantitative UV error or metrics.
- Face-on MAE is exclusively derived from the orthographic UV-grid control. The accompanying perspective face-on photograph is simply a visual representation of that isolated control environment, absolutely not a secondary measurable metric.
- Analytic UV error is strictly scored within the spherical indent interior only. The POM secant lerp is fundamentally an approximation, not a perfect ray–height intersection; thus, the residual error against the true analytic solution remains fully in scope for this evaluation.
- March-slice “analytic” data represents a dense 1-D mathematical first-crossing of our precisely authored cosine ridge, not a perfectly closed-form sphere.
- Silhouette XOR inherently requires a profile camera orientation to be measured accurately. The minor face-on XOR of is attributable to edge noise and is not the architectural discrepancy under examination. The AABB span being mathematically serves as our definitive proof of true geometric extrusion.
- Self-shadow agree pits an march against a denser march evaluating the exact same underlying height field; it is not a geometric comparison against a physically displaced mesh, nor is it a hardware shadow map.
- Height LOD. Evaluated at , yielding . The resulting structural softening is visually apparent but functionally modest, relying entirely on the geometric Jacobian.
- Scale is rigorously locked to guarantee readable interior parallax across this specific architectural asset. Increasing the scale to intentionally triggers the swim/miss failure mode for educational demonstration.
- No
gl_FragDepth, no cone-step, no tessellation. The absolute physical coverage of the POM rendering path strictly remains bounded by the flat 2-triangle quad. - Brick is CPU procedural, explicitly not a high-fidelity photogrammetry scan. Analytic error was measured purely on the mathematical sphere instrument, not on the noisy procedural brick asset.
Bump mapping strictly perturbs the normal vector at the existing geometric UV coordinate. Offset mapping applies a single, naive coordinate translation. POM continuously marches a ray through a bounded mathematical volume. True displacement physically translates the geometric vertices. Only the final technique is physically capable of expanding the mesh's silhouette.
Pin the grazing 3-up comparison as the definitive presentation. Pin the bump-vs-POM analysis as the primary lighting evaluation. Pin the silhouette XOR comparison as the stark, mathematical quantification of the technique's fundamental lie. Pin the 1-D march slice accompanied by the analytic UV-error heatmap as our rigorous scientific theorem. The foundational formula operates as the caption, and the XOR fraction perfectly encapsulates exactly why the mesh's outline remains a planar quad.
Out of scope
Hardware paths, product filters, and instruments named only as excluded in the honesty notes remain out of scope for this measurement.
Dense meters follow.
Appendix A — Meters (quote tables, not photographs)
Operating under a locked scale of , zero bias , and rendered via the Mesa llvmpipe driver, we observe the following measurements:
| Metric | Context | Value |
|---|---|---|
| Mean UV Error | POM indent interior, , | |
| Mean UV Error | POM indent interior, , | |
| 95th Percentile UV Error | POM indent interior, , | |
| Fraction | sil-xor floor vs roof, , profile | 0.575 |
| MAE (Bump, POM) | Face-on, , | 0 |
| Silhouette XOR | Face-on, , | 0.029 |
| Mean First-Hit Layer | POM field, , | 9.06 |
| Shadow Agreement | vs , , same field | 0.993 |
The error reduction from () to () demonstrates strong convergence. The silhouette discrepancy remains significant at grazing angles (), corroborated by the AABB span confirming an extrusion of . We formally assert that at , . It is critical to emphasize that these analytic error metrics are derived solely from the mathematical sphere indent instrument. They must not be conflated with the qualitative brick texture renderings. Do not attempt to synthesize a general GL UV error metric or a subjective quality score from the provided photographic plates.