phong_shade — 3D render op

• Data kinds: normalmap → image2d

• Call: import fullseye as fs; fs.ledger.phong_shade(normals, view=(0.0, 0.0, 1.0), light=(0.0, 0.0, 1.0), ambient: 'float' = 0.1, diffuse: 'float' = 0.8, specular: 'float' = 0.5, shininess: 'float' = 32.0, clip: 'bool' = True) -> 'np.ndarray' (implementation को सीधे call करना हो तो import render_shade; render_shade.phong_shade(normals, view=(0.0, 0.0, 1.0), light=(0.0, 0.0, 1.0), ambient: 'float' = 0.1, diffuse: 'float' = 0.8, specular: 'float' = 0.5, shininess: 'float' = 32.0, clip: 'bool' = True) -> 'np.ndarray', registry से लेना हो तो ops3d.get("phong_shade"))

उपयोग

Phong reflection model से normal map को shade करता है (ambient + diffuse + specular)। → (H, W)।

हर foreground pixel पर unit normal N के लिए, light की दिशा L को N के सापेक्ष specular reflect करके मिलने वाली आदर्श reflection दिशा R = 2(N·L)N − L निकालता है, और दृष्टि-दिशा V से उसके मेल से specular term बनाता है::

I = ambient + diffuse * max(N·L, 0) + specular * max(R·V, 0)^shininess

specular term केवल उन सतहों पर लगता है जिन पर प्रकाश पड़ता है (N·L > 0)। यह render_lambertian में specular lobe जोड़ने जैसा है, और highlight का peak diffuse अधिकतम (N=L) पर नहीं बल्कि half-angle दिशा N = normalize(L+V) पर होता है (तब R=V और R·V=1)।

background (लंबाई 0 वाले normal = render3d.render_mesh के खाली pixel) 0 है। clip=True output को [0, 1] पर clip करता है (display के लिए), clip=False raw जोड़ी गई intensity लौटाता है (argmax से highlight की स्थिति सटीक लेनी हो तो यही — saturation से peak बराबरी पर नहीं आता)।

Args:

• normals : float (H, W, 3) normal map (view space, viewer की ओर; लंबाई 0 = background)।

• view : surface → viewer की दिशा (default (0,0,1) = render3d का viewpoint)।

• light : surface → light source की दिशा।

• ambient/diffuse/specular : हर term का coefficient (finite, non-negative)।

• shininess: specular lobe की तीक्ष्णता (> 0; बड़ा = तीक्ष्ण / छोटा = चौड़ा)।

• clip : [0,1] पर clip करना है या नहीं।

fail-closed: अमान्य shape, non-finite मान, शून्य लंबाई की दिशा, non-positive shininess और negative coefficient पर ValueError।

पृष्ठभूमि guides (इस op के पीछे की physics और conventions)

• blender_interop — Blender के साथ उपयोग — shape बनाएँ, fullseye से मापें (सावधानियाँ: axes, units, ground truth)

संदर्भ (sample data, साहित्य)

• 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 के स्रोत।

चलाए जा सकने वाले उदाहरण (verified samples जो सच में यह op call करते हैं)

• render_beauty — py -3.11 examples_3d/render_beauty.py

• render_shade — py -3.11 examples_3d/render_shade.py

वे अगले ops जिनसे type जुड़ता है (image2d को input के रूप में लेते हैं)

fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · polar_unwrap · fit_zernike · matcap_shade

इसी category के (render)

project_points · render_point_depth · render_volume_projection · render_shaded · ambient_occlusion · cast_shadow · matcap_shade · supersample_mesh


*Provenance: render_shade.py — 3D operator registry. यह per-op note tools/opdocs.py md से अपने-आप generate होता है (हाथ से edit न करें)।*

© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.