phong_shade — 3D 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"))

Verwendung

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.

Hintergrundwissen (Physik und Konventionen hinter diesem Operator)

• blender_interop — Zusammen mit Blender — Form bauen, mit fullseye messen (Fallstricke: Achsen, Einheiten, Referenzdaten)

Referenzen (Beispieldaten, Literatur)

• 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.

Ausführbare Beispiele (verifizierte Samples, die diesen Operator wirklich aufrufen)

• render_beauty — py -3.11 examples_3d/render_beauty.py

• render_shade — py -3.11 examples_3d/render_shade.py

Typkompatible Folge-Operatoren (nehmen image2d als Eingabe)

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

Gleiche Kategorie (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.