Match era constraints: polycount, texture filtering, lighting model, and post stack.
Recipe
Match the era's constraints. PS1: 320x240, 32px textures, nearest filtering, vertex snap 0.02 m, under 1,000 tris per character, fog. PS2: 640x480, bilinear, 5-10k tris. VHS/CRT: 4:3 low-res plus noise and desaturation. Film grain: cinematic/noir grade.
- PS1 (and PS1-like arcade):
lowpoly-style/ps1_look.pywithobjects[target],snap0.02,resolution[320, 240],fogTrue,textureTrue. - Reduce geometry to era budget with
lod-pipeline/generate_lods.py(ratios[0.5, 0.25]) orasset-optimization/optimize_mesh.py(limited_dissolve1.0,triangulateTrue). - Light with
lighting/light_rig.pyovercast(flat vertex-lit feel) and no raytracing:rendering/render_preset.pystylized_flat. - For VHS/CRT/film:
compositing/comp_grade.pyhorror_vhs(VHS, CRT pixelation 2),noir(B&W film),cinematic(PS4/PS5 filmic). - PS3-PS5: use
rendering/render_preset.pyeevee_finalinstead ofstylized_flatfor full PBR and raytracing.
import runpy
skills = "<skills_dir>" # parent folder of this skill (the plugin's skills/ directory)
target = "SM_Asset" # object to style / dress
r = {}
r["ps1"] = runpy.run_path(f"{skills}/lowpoly-style/scripts/ps1_look.py", init_globals={"ARGS": {"objects": [target], "snap": 0.02, "resolution": [320, 240], "fog": True, "texture": True}})["result"]
r["light"] = runpy.run_path(f"{skills}/lighting/scripts/light_rig.py", init_globals={"ARGS": {"preset": "overcast", "target": target}})["result"]
r["render"] = runpy.run_path(f"{skills}/rendering/scripts/render_preset.py", init_globals={"ARGS": {"preset": "stylized_flat"}})["result"]
r["grade"] = runpy.run_path(f"{skills}/compositing/scripts/comp_grade.py", init_globals={"ARGS": {"preset": "horror_vhs"}})["result"]
result = r