reflectance op• Data kinds: normalmap → image2d
• Call: import fullseye as fs; fs.ledger.brdf_microfacet(normals, light=(0.0, 0.0, 1.0), view=(0.0, 0.0, 1.0), roughness=0.3, f0=0.04) (implementation को सीधे call करना हो तो import specularity; specularity.brdf_microfacet(normals, light=(0.0, 0.0, 1.0), view=(0.0, 0.0, 1.0), roughness=0.3, f0=0.04), registry से लेना हो तो opsspecular.get("brdf_microfacet"))
GGX / Trowbridge-Reitz microfacet specular BRDF। → (H, W), इकाई 1/sr।
> नीचे का विस्तृत विवरण मूल text में है — सारांश और headings का अनुवाद हो चुका है।
f_s = D * G * F / (4 (n.l) (n.v)) with
• D the Trowbridge-Reitz (1975) / GGX normal distribution, a^2 / (pi * ((n.h)^2 (a^2 - 1) + 1)^2) for a = roughness^2, which integrates to 1 against (n.h) dw over the hemisphere — measured by 20000-point midpoint quadrature in tests/test_specularity.py at relative errors 3.2e-07, 6.3e-08 and 4.0e-09 for roughness 0.2, 0.3 and 0.6, all of it quadrature error (the 200000-point rule gives 3.2e-09, 6.3e-10, 4.0e-11, exactly the 100x a midpoint rule predicts);
• G the separable Smith (1967) masking-shadowing term with the GGX lambda;
• F Schlick's (1994) Fresnel approximation, f0 + (1 - f0) (1 - v.h)^5. *f0* is the normal-incidence reflectance:
about 0.04 for common dielectrics, 0.5 to 1.0 for metals. When the exact
Fresnel curve matters, use match3d.fresnel_reflectance instead — this
is the approximation the microfacet literature specifies, and it is named
rather than hidden.
Exact ground truth it reproduces: at normal incidence with light, view and normal aligned, every geometric factor is 1 and the value collapses to f0 / (4 pi roughness^4) in closed form — reproduced bit for bit at roughness 0.3, 0.5 and 1.0 and to 3.3e-16 relative at roughness 0.1, which took rewriting the GGX denominator to avoid a cancellation (see the comment at the code; the textbook arrangement was off by 2.2e-13 relative at the peak). The lobe is reciprocal in light and view to machine precision (measured 1.7e-16), and its maximum sits at the half-vector.
roughness is the perceptual parameter, squared once to reach the GGX alpha — the convention that makes a linear slider feel linear. A perfectly smooth surface (roughness = 0) is a delta function, not a finite BRDF, so it is refused rather than returned as an infinity.
Raises ValueError: geometry problems as in brdf_blinn_phong; *roughness* outside (0, 1]; *f0* outside [0, 1].
• specular_photometric family guide
• Sample data catalog (DL URL / license) — 2-D के लिए skimage.data (BSD/public) + synthetic, 3-D के लिए real data sources (Stanford/PDS आदि) के DL URL।
• Operators का स्रोत और संदर्भ — इस op family के मूल research/methods के स्रोत।
• Algorithm का मानक स्रोत (लेखक, वर्ष) और उपयोग ऊपर की family usage guide में दिए गए हैं।
• poc_solder_fillet_aoi — py -3.11 examples/poc_solder_fillet_aoi.py
• specular_photometric — py -3.11 examples/specular_photometric.py
image2d को input के रूप में लेते हैं)reflectance)brdf_blinn_phong · dichromatic_render
*Provenance: specularity.py — SPECULAR operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.