Compositor Rewrite
This commit is contained in:
29
.obsidian/workspace.json
vendored
29
.obsidian/workspace.json
vendored
@@ -194,8 +194,20 @@
|
|||||||
"pdf-plus:PDF++: Toggle auto-paste": false
|
"pdf-plus:PDF++: Toggle auto-paste": false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"active": "69a5c474fe4b0e88",
|
"active": "5160c41cbad83466",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
|
"Prewrite/Compositor Rewrite.md",
|
||||||
|
"Attachments/Images/Comparing_three_images.png",
|
||||||
|
"Attachments/Images/final_skin_shader.png",
|
||||||
|
"Attachments/Images/final_skin_shader.png.0.pdnSave",
|
||||||
|
"Attachments/Images/final_skin_shader.tif",
|
||||||
|
"Attachments/Images/final_compositing_tree.png",
|
||||||
|
"Attachments/Images/final_compositing_tree.png.0.pdnSave",
|
||||||
|
"Attachments/Images/final_compositing_tree.tif",
|
||||||
|
"Attachments/Images/final_compositing_tree",
|
||||||
|
"Attachments/Images/Untitled",
|
||||||
|
"Attachments/Untitled",
|
||||||
|
"Was ich so gemacht habe/Arbeitszeit und so.md",
|
||||||
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-nostep-cubic.png",
|
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-nostep-cubic.png",
|
||||||
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-step-cubic.png",
|
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-step-cubic.png",
|
||||||
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-step-linear.png",
|
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-step-linear.png",
|
||||||
@@ -203,20 +215,14 @@
|
|||||||
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-step-closest.png",
|
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-step-closest.png",
|
||||||
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-nostep-closest.png",
|
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-aa-nostep-closest.png",
|
||||||
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-noaa-cubic.png",
|
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-noaa-cubic.png",
|
||||||
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-noaa-linear.png",
|
|
||||||
"Attachments/Images/AntialisingAndInterpolateMasks/eyelid-noaa-closest.png",
|
|
||||||
"Attachments/Images/AntialisingAndInterpolateMasks",
|
"Attachments/Images/AntialisingAndInterpolateMasks",
|
||||||
"Was ich so gemacht habe/Arbeitszeit und so.md",
|
|
||||||
"Prewrite/Compositor Rewrite.md",
|
|
||||||
"Untitled.md",
|
"Untitled.md",
|
||||||
"Zu recherchierende Dinger.md",
|
"Zu recherchierende Dinger.md",
|
||||||
"Zeitplan.excalidraw.md",
|
"Zeitplan.excalidraw.md",
|
||||||
"TODO.md",
|
"TODO.md",
|
||||||
"Pasted Image 20251101190228_950.png",
|
|
||||||
"Motivator.excalidraw.md",
|
"Motivator.excalidraw.md",
|
||||||
"Modellieren in Blender.md",
|
"Modellieren in Blender.md",
|
||||||
"Linux.md",
|
"Linux.md",
|
||||||
"Gray894.png",
|
|
||||||
"Exposé.md",
|
"Exposé.md",
|
||||||
"Drawing 2025-10-31 18.39.54.excalidraw.md",
|
"Drawing 2025-10-31 18.39.54.excalidraw.md",
|
||||||
"Bekerman et al. - 2014 - Variations in Eyeball Diameters of the Healthy Adults.pdf",
|
"Bekerman et al. - 2014 - Variations in Eyeball Diameters of the Healthy Adults.pdf",
|
||||||
@@ -231,16 +237,9 @@
|
|||||||
"Paperung/Medizinischer Hintergrund/René - 2006 - Update on orbital anatomy.pdf",
|
"Paperung/Medizinischer Hintergrund/René - 2006 - Update on orbital anatomy.pdf",
|
||||||
"Paperung/Medizinischer Hintergrund/Der Periorbitalbereich.excalidraw.md",
|
"Paperung/Medizinischer Hintergrund/Der Periorbitalbereich.excalidraw.md",
|
||||||
"1_Trash/CompositorUp0date/Compositor.excalidraw.md",
|
"1_Trash/CompositorUp0date/Compositor.excalidraw.md",
|
||||||
"1_Trash",
|
|
||||||
"Notizen/Untitled 1.md",
|
"Notizen/Untitled 1.md",
|
||||||
"Notizen/Untitled.md",
|
"Notizen/Untitled.md",
|
||||||
"Notizen/Compositor.md",
|
"Notizen/Compositor.md",
|
||||||
"Notizen/16.10.2025.md",
|
"Notizen/16.10.2025.md"
|
||||||
"Attachments/Images/CryptoMatte",
|
|
||||||
"Paperung/Medizinischer Hintergrund/Orbita - DocCheck Flexikon.html",
|
|
||||||
"Paperung/Medizinischer Hintergrund/Orbita - DocCheck Flexikon.htm",
|
|
||||||
"Paperung/Medizinischer Hintergrund/Orbita - DocCheck Flexikon_files/consent.js",
|
|
||||||
"Paperung/Medizinischer Hintergrund/Orbita - DocCheck Flexikon_files/runtime.12f88696.js",
|
|
||||||
"Paperung/Medizinischer Hintergrund/Orbita - DocCheck Flexikon_files/iframeResizer.min.js"
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
BIN
Attachments/Images/final_compositing_tree.png
Normal file
BIN
Attachments/Images/final_compositing_tree.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 684 KiB |
BIN
Attachments/Images/final_skin_shader.png
Normal file
BIN
Attachments/Images/final_skin_shader.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 198 KiB |
@@ -172,7 +172,24 @@ In der textures.py-Datei wurde der Code für die generierung des Skin-Materials
|
|||||||

|

|
||||||
Außerdem wird eine AOV Output-Node erzeugt. Der Name muss der selbe sein, wie er in den Shader AOVs des ViewLayers festgelegt wurde. Hier "Eyelid Mask". Der Color-Ausgang der Texture Image Node wird mit dem Value EIngang des AOV Outputs verbunden.
|
Außerdem wird eine AOV Output-Node erzeugt. Der Name muss der selbe sein, wie er in den Shader AOVs des ViewLayers festgelegt wurde. Hier "Eyelid Mask". Der Color-Ausgang der Texture Image Node wird mit dem Value EIngang des AOV Outputs verbunden.
|
||||||
|
|
||||||
Im Compositing Node-Tree erhält die "Render Layers"-Node jetzt einen zusätzlichen Ausgang "Eyelid Mask" (aber nur für den Main-ViewLayer). Dieser stellt jetzt eine Textur bereit in der die an die AOV OUtput-Nodes übergebenen Ergebnisse enthalten sind. Diese ist allerdings so noch nicht direkt als Segmentierungsmaske verwendbar, da sie nicht nur 0 und 1 enthält, sondern auch Werte dazwischen. Das kommt auf der einen Seite durch die verwendete Textur-Interpolation. Denn die kubische Interpolation erzeugt an Pixel-Übergängen zwischen einem schwarzen und einem weißen Pixel einen weichen Übergang aus Graustufen. Auf der anderen Seite liegt das aber daran, dass Blender mit dem Eevee-Renderer Temporal-Anti-Aliasing (TAA) verwendet um harte Pixelkanten zu glätten. Dies könnte deaktiviert werden, ist aber für normale Bilder grundsätzlich ein erwünschter Effekt um unnatürliche Kanten zu glätten und Flimmern von kleinen Details zu reduzieren. Das führt allerdings auch dazu, dass AOVs geglättet werden, daher wird eine "Greate Than"-Node verwendet, die als Eingangswert ("Value") den "Eyelid Mask"-Output der "Render Layer"-Node erhält. In dieser Node kann ein Schwellwert festgelegt werden. Für alle Pixel, deren Wert über diesen Schwellwert liegen wird 1 ausgegeben. Für alle, die drunter liegen 0. Dadurch wird trotz Kantenglättung im Renderprozess in der finalen Maske nur 0 und 1 ausgegeben.
|
Die Abbildung zeigt den finalen Node-Graphen für das Haut-Material. Es gibt unverändert den Teil, der die Haut-Textur einliest, die Grauwerte bearbeitet und als Emission-Shader ausgibt. Neu ist der Teil "Eyelid Segmentation Mask", welche die eben beschriebene "eyelid-mask"-Textur einliest und als AOV rausschreibt. Für bessere Übersichtlichkeit und Dokumentation wurde im `blender_helper.py`-Script die Funktion `frame_nodes` implementiert. Dieser übergibt man einen Node-Tree, in dem der neue Rahmen erzeugt werden soll, den Titel, der über dem Rahmen stehen soll, sowie alle Nodes, die in diesem zusammengefasst werden sollen.
|
||||||
|
|
||||||
|
Auch neu ist die Funktion `create_dont_change_note`, welche eine Notiz an einer angegebenen Stelle erzeugt, die darauf hinweist, dass der Node-Graph automatisch generiert wird und in den Scripts angepasst werden muss.
|
||||||
|
|
||||||
|
```py
|
||||||
|
def frame_nodes(node_tree: bpy.types.NodeTree, frame_label: str, framed_nodes: list[bpy.types.Node]) -> bpy.types.NodeFrame:
|
||||||
|
...
|
||||||
|
|
||||||
|
def create_dont_change_note(node_tree: bpy.types.NodeTree, location: tuple[float, float] = (-420.000, 40.000)) -> bpy.types.Node:
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
![[final_skin_shader.png]]
|
||||||
|
|
||||||
|
Im Compositing Node-Tree erhält die "Render Layers"-Node jetzt einen zusätzlichen Ausgang "Eyelid Mask", wenn der Main-ViewLayer ausgewählt wird. Dieser stellt ein Bild bereit in dem die an die AOV Output-Nodes übergebenen Ergebnisse enthalten sind, also die Augenlid-Maske. Diese ist allerdings noch nicht direkt als Segmentierungsmaske verwendbar, da sie als Werte nicht nur 0 und 1 enthält, sondern auch interpolierte Werte dazwischen. Für diese Interpolation gibt es zwei Gründe:
|
||||||
|
Zum einen liegt es daran, dass die einzelnen Texel der Augenlid-Textur, die im Shader eingelesen wird, ggf. mehrere Pixel der finalen Segmentierungsmaske abdecken. In diesem Fall wird zwischen den Texels interpoliert. Das ist mit normalen Texturen oft erwünscht, damit keine harten Texel-Kanten sichtbar sind, führt in diesem Fall aber dazu, dass andere Werte als 0 und 1 vorhanden gerendert werden. Denn die kubische Interpolation erzeugt an Pixel-Übergängen zwischen einem schwarzen und einem weißen Pixel einen weichen Übergang aus Graustufen.
|
||||||
|
Auf der anderen Seite liegt das aber daran, dass Blender mit dem Eevee-Renderer Temporal-Anti-Aliasing (TAA) verwendet um harte Pixelkanten zu glätten, indem mehrere Samples des gleichen Pixels zusammengeführt werden. Diese Kantenglättung kann deaktiviert werden, ist aber für normale Bilder grundsätzlich ein erwünschter Effekt um unnatürliche Kanten zu glätten und Flimmern von Details, die kleiner als einzelne Pixel sind, zu reduzieren. Dieser Effekt wird auch auf AOVs angewandt, was für unsere Segmentierungsmaske unerwünscht ist.
|
||||||
|
Um trotz Kantenglättung und Texel-Interpolation scharfe Kanten in der Segmentierungsmaske zu erreichen wird eine "Greate Than"-Node (egl. Größer als) verwendet, die als Eingangswert ("Value") den "Eyelid Mask"-Output der "Render Layer"-Node erhält. In der Node kann ein Schwellwert festgelegt werden. Für alle Pixel, deren Wert über diesen Schwellwert liegen wird 1 ausgegeben. Für alle, die drunter liegen 0. Dadurch wird trotz Kantenglättung im Renderprozess in der finalen Maske nur 0 und 1 ausgegeben.
|
||||||
Abbildung CYC demonstriert die Effekte von Kantenglättung und verschiedenen Textur-Interpolationsmethoden auf die finale Segmentierungsmaske.
|
Abbildung CYC demonstriert die Effekte von Kantenglättung und verschiedenen Textur-Interpolationsmethoden auf die finale Segmentierungsmaske.
|
||||||
|
|
||||||
(TODO: Wenn Zeit ist, kann das ja ein Exkurs werden. Es reicht eigentlich zu zeigen: (Kein) AA Kubisch vs Closest)
|
(TODO: Wenn Zeit ist, kann das ja ein Exkurs werden. Es reicht eigentlich zu zeigen: (Kein) AA Kubisch vs Closest)
|
||||||
@@ -184,4 +201,6 @@ Abbildung CYC demonstriert die Effekte von Kantenglättung und verschiedenen Tex
|
|||||||
| Antialiasing, Greater Than | | | |
|
| Antialiasing, Greater Than | | | |
|
||||||
|
|
||||||
|
|
||||||
Der Code für das Generieren des Compositing Trees wurde so angepasst, dass statt
|
Der Code für das Generieren des Compositing Graphen (`nodetree.py`) wurde so angepasst, dass diese Schwellwert-Berechnung angewandt wird. Außerdem wurden alle Verbindungen mit der alten Cryptomatte-Maske des Augenlid-Objekts durch die Schwellwert-Node binärisierte "Eyelid Mask" ersetzt. (TODO: vielleicht ei
|
||||||
|
|
||||||
|
![[final_compositing_tree.png]]
|
||||||
@@ -135,3 +135,11 @@ Dementsprechend Script angepasst
|
|||||||
|
|
||||||
# 07.02.2026
|
# 07.02.2026
|
||||||
Swappen der Hierarchie von Iris und Sclera:
|
Swappen der Hierarchie von Iris und Sclera:
|
||||||
|
|
||||||
|
# 13.02. und 14.02.
|
||||||
|
Augenlid Segmentierungsmaske gemacht (deutlich einfacheren Ansatz gefunden).
|
||||||
|
Compositing umgebaut, um neue Augenlid-Maske zu verwenden
|
||||||
|
Code refactorings
|
||||||
|
|
||||||
|
# 15.02.2026
|
||||||
|
Backface culling für Sclera ausgemacht -> Man kann nicht mehr an der Iris vorbeigucken, wenn diese sehr groß ist.
|
||||||
Reference in New Issue
Block a user