Texel discipline. Crisp pixels. Limited palette.
Tenets
- Declare target texel size / texture res
- Nearest filtering intent
- Limited palette
- Avoid thin triangles that shimmer
- Ortho or locked angles help readability
Reference Guide
| Topic | Reference |
|---|---|
| Texel rules | references/texel-rules.md |
Recipe
Target 320x180 internal render (16 px tiles), dimetric 2:1 camera, a 16-32 color palette, nearest filtering, no shading gradients.
- Camera:
iso_camera.pyprojection"dimetric_2_1" withpixel_tile16 (2:1 pixel-art tile ratio, crisp resolution multiple). - Shading:
toon_material.pywithbands3,rim0,outline0 for flat palette-friendly bands. - Render preset:
render_preset.pystylized_flat(Standard view transform keeps palette colors exact). Run it beforeps1_look.py, since presets reset resolution. - Render settings:
ps1_look.pywithsnap0,resolution[320, 180],flatTrue,fogFalse (low-res, Nearest texture filtering, 32 px textures). - Palette reduction is not scripted: quantize afterwards in an image tool, or use a ColorRamp with constant interpolation in the compositor.
import runpy
skills = "<skills_dir>" # parent folder of this skill (the plugin's skills/ directory)
target = "SM_Asset" # object to style / dress
r = {}
r["camera"] = runpy.run_path(f"{skills}/isometric-style/scripts/iso_camera.py", init_globals={"ARGS": {"projection": "dimetric_2_1", "target": target, "pixel_tile": 16}})["result"]
r["toon"] = runpy.run_path(f"{skills}/stylized-style/scripts/toon_material.py", init_globals={"ARGS": {"name": "MAT_Toon_Pixel", "base_color": [0.8, 0.5, 0.3], "bands": 3, "rim": 0.0, "objects": [target], "outline": 0.0}})["result"]
r["render"] = runpy.run_path(f"{skills}/rendering/scripts/render_preset.py", init_globals={"ARGS": {"preset": "stylized_flat"}})["result"]
r["pixel"] = runpy.run_path(f"{skills}/lowpoly-style/scripts/ps1_look.py", init_globals={"ARGS": {"objects": [target], "snap": 0, "resolution": [320, 180], "flat": True, "fog": False}})["result"]
result = r