render op• Datenarten: normalmap → image2d
• Aufruf: 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' (die Implementierung direkt: 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'; aus dem Register: ops3d.get("phong_shade"))
Schattiert eine Normalenkarte mit dem Phong-Reflexionsmodell (Ambient + Diffus + Spekular). → (H, W).
Berechnet an jedem Vordergrundpixel für die Einheitsnormale N die ideale Reflexionsrichtung, die durch Spiegelung der Lichtrichtung L an N entsteht, R = 2(N·L)N − L, und bildet aus ihrer Übereinstimmung mit der Blickrichtung V den spiegelnden Term::
I = ambient + diffuse * max(N·L, 0) + specular * max(R·V, 0)^shininess
Der spiegelnde Term wirkt nur auf beleuchtete Flächen (N·L > 0). Es ist render_lambertian mit einer zusätzlichen spiegelnden Keule, und der Glanzlichtgipfel liegt nicht beim Diffusmaximum (N=L), sondern in der Halbwinkelrichtung N = normalize(L+V) (dort ist R=V und R·V=1).
Der Hintergrund (Normalen der Länge 0 = leere Pixel von render3d.render_mesh) ist 0. clip=True clippt die Ausgabe auf [0, 1] (für die Anzeige), clip=False gibt die rohe summierte Intensität zurück (dies verwenden, wenn die Glanzlichtposition exakt per argmax bestimmt werden soll — durch Sättigung entsteht kein Gleichstand am Gipfel).
Argumente:
• normals : float (H, W, 3) Normal Map (Sichtraum, zum Betrachter gerichtet; Länge 0 = Hintergrund).
• view : Richtung Fläche→Betrachter (Standard (0,0,1) = Blickpunkt von render3d).
• light : Richtung Fläche → Lichtquelle.
• ambient/diffuse/specular : Koeffizient jedes Terms (endlich, nicht negativ).
• shininess: Schärfe der spiegelnden Keule (> 0; größer ist schärfer / kleiner ist breiter).
• clip : ob auf [0,1] geclippt wird.
fail-closed: ungültige Formen, nicht endliche Werte, Richtungen der Länge null, nicht positives shininess und negative Koeffizienten lösen ValueError aus.
• blender_interop — Zusammen mit Blender — Form bauen, mit fullseye messen (Fallstricke: Achsen, Einheiten, Referenzdaten)
• Katalog der Beispieldaten (Download-URLs / Lizenzen) — 2-D nutzt skimage.data (BSD/Public Domain) plus synthetische Bilder, 3-D nennt Download-URLs echter Datenquellen (Stanford, PDS, …).
• Herkunft und Literatur der Operatoren — die Quellen der Forschung/Verfahren, auf denen diese Operatorfamilie beruht.
• render_beauty — py -3.11 examples_3d/render_beauty.py
• render_shade — py -3.11 examples_3d/render_shade.py
image2d als Eingabe)fuse_to_voxel · fit_poly_surface · eval_poly_surface · surface_form_error · background_flatten · polar_unwrap · fit_zernike · matcap_shade
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. Diese Notiz wird von tools/opdocs.py md erzeugt (nicht von Hand bearbeiten).*
© 2026 Kazufumi Furuse — Fullseye operator documentation. Licensed under Apache-2.0.