CommunityImagegithub.com

threejs-procedural-textures

Génère des textures photoréalistes procédurales en temps réel dans three.js (sans aucun fichier image). Supporte : bruit seamless, normal map depuis hauteurs en mm, rugosité et AO packagés, Canvas2D vers texture, albédo moyen (pour le baking GI), et vérification des coutures.

Qu'est-ce que threejs-procedural-textures ?

Ce skill permet de générer des textures procédurales photoréalistes dans three.js sans utiliser aucun fichier image externe. Il fournit une bibliothèque complète de fonctions pour créer toutes sortes de matériaux : bois, parquet, tissus, métal peint, traces d'usure, etc. L'approche est basée sur des unités physiques (hauteurs en millimètres, UV en mètres) pour garantir la cohérence visuelle quelle que soit la résolution. Toutes les textures sont répétables et reproductibles grâce à un générateur de nombres aléatoires à seed fixe et des bruits périodiques. Le skill est conçu pour les projets three.js, mais les concepts peuvent être adaptés à d'autres moteurs (Godot, Unreal).

Compatible avec✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/ammosu/claude-threejs-photoreal/tree/HEAD/skills/threejs-procedural-textures

Installed? Explore more Image skills: steipete/songsee, affaan-m/frontend-design, mattpocock/improve-codebase-architecture · View all 6 →

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Génération de textures procédurales

Source : room-at-dawn (MIT), issu de src/core/tex.js, rng.js, src/scene/materials.js et des fonctions de matériaux des pièces dans parts/. Le projet original ne contient aucun fichier image dans la chambre ; toutes les textures sont générées par programme au chargement.

Idées clés :

  1. Conception en unités physiques. Les hauteurs sont en millimètres, la taille de la texture en mètres est précisée, les UV sont en mètres. Ainsi repeat = 1 / tileMètres, et changer la résolution ne modifie pas l'aspect.
  2. Le réalisme vient surtout de la rugosité, pas de la couleur. Les empreintes digitales, les traces d'essuyage, la poussière sont quasi invisibles en couleur ; ils ne se révèlent que sous les reflets spéculaires.
  3. Tout est répétable et reproductible. Les bruits ont une période, l'aléatoire utilise RNG(seed). Même seed donne toujours le même résultat (indispensable pour le baking GI, les tests de régression).

Fichiers

CheminContenu
scripts/tex.jsFonctions de base : RNG, pnoise/pfbm (période par axe), worley, vn (bruit rapide par table), field, normalBytes (en mm), dataTex/canvasTex/packTex/colorTex, avgColor, once (cache), rep (image partagée, seul le repeat change), seamScore, texData
scripts/surfaces.jswallNormal + wallPatch (papier peint bois avec variations de plâtre et peinture à l'échelle 3,2 m), lacquerNormal, smudgeRough, dustRough, floorMaps, woodMaps, oakVeneer
scripts/textiles.jsweaveNormal, waffleNormal, terryNormal, ribNormal, knitNormal, feltNormal, ropeNormal, fabricMaterial (sheen + translucidité à contre-jour)
scripts/wear.jswornMaps (surface usée complète : deux canvas couleur et rugosité), speckleTexture, scuffTexture, et pinceaux de base softBlob, strand, fingerprint, noiseTile, overlay
scripts/print.jsword/phrase (mots factices générés par syllabes), PAL, packer, fitText, paperGrain, makeBook + bookAtlas + bookGeometry, pagesTexture, topoPoster, photoPrints
example/Coin de pièce, chaque surface utilise un matériau de la bibliothèque. ?cam= (room, desk, glint, fabric, floor, wall, books) ; ?flat=1 pour un rendu en couleur unie
example/preview.jpgCapture d'écran de l'exemple
references/recipes.mdRecettes pour chaque matériau : dimensions, paramètres, et comment en ajouter de nouveaux
references/verify-engines.mdMéthodes de vérification, problèmes rencontrés, performances, et portage vers Godot/Unreal

Lancer l'exemple

cd <dossier_skill> && python3 -m http.server 5422 --bind 127.0.0.1
# Ouvrir http://127.0.0.1:5422/example/   (window.__tex donne le temps de génération, le score de couture, l'albedo moyen de chaque texture)

(<dossier_skill> est le répertoire de base affiché lors du chargement du skill ; en tant que plugin, il se trouve sous ~/.claude/plugins/cache/)

Utilisation

import { rep } from './scripts/tex.js';
import { floorMaps, wallNormal, wallPatch, lacquerNormal } from './scripts/surfaces.js';
import { knitNormal, fabricMaterial } from './scripts/textiles.js';
import { wornMaps } from './scripts/wear.js';

const fl = floorMaps();                                   // UV en mètres ; repeat déjà défini
floor.material = new THREE.MeshStandardMaterial({ map: fl.map, normalMap: fl.normalMap, roughnessMap: fl.roughnessMap, roughness: 1 });
wall.material = wallPatch(new THREE.MeshStandardMaterial({ color: 0xebebe6, roughness: 0.93, normalMap: wallNormal() }));
door.material = new THREE.MeshStandardMaterial({ color: 0xdddddd, roughness: 0.6, normalMap: rep(lacquerNormal(), 9), normalScale: new THREE.Vector2(0.18, 0.18) });
sweater.material = fabricMaterial(0x6f7f6a, { normal: knitNormal(), tileM: 0.1 });
const w = wornMaps({ sizeM: [1.2, 0.6], hands: [[0.55, 0.5]], rings: [[0.9, 0.4, 0.032, 0.6]], prints: 6 });
deskTop.material = new THREE.MeshStandardMaterial({ map: w.map, roughnessMap: w.roughnessMap, roughness: 1 });
  • Pour les matériaux avec roughnessMap, définir roughness à 1. three.js multiplie les deux.
  • La rugosité de packTex et de wornMaps est dans le canal G ; un canvas en niveaux de gris peut aussi être utilisé directement.
  • Chaque matériau renvoie avg (couleur moyenne linéaire) pour threejs-baked-gi comme albédo de rebond lumineux.

Règles impératives

  1. Ne pas utiliser Math.random(). Chaque texture doit avoir une seed fixe.
  2. La période des bruits doit être un entier et alignée avec le nombre de tuiles. (ex. pfbm(u*6, v*6, oct, seed, 6)). Sinon, il y a des coutures. Utiliser seamScore pour vérifier.
  3. Les hauteurs sont en millimètres, utiliser normalBytes(H, w, h, mmParTuile). Changer la résolution ne modifie pas l'intensité des reliefs ; certains matériaux ont des tuiles non carrées (sol 1,1 × 1,9 mm), il faut donner les deux axes séparément.
  4. Dessiner la rugosité en même temps que la couleur. Chaque coup de pinceau de wornMaps dessine simultanément sur les deux canvas, en utilisant le même new RNG(i) pour aligner les formes.
  5. Sur les surfaces sombres, réduire les débris et les points brillants (dans l'exemple, le plateau sombre passe de 9000 à 2500), sinon l'aspect devient granitique.
  6. Le texte et les motifs dessinés sur canvas doivent être générés par le code (word(), formes géométriques). Ne pas utiliser de vrais noms de livres, marques ou logos.
  7. La plus grande texture (2048²) prend 0,1 à 0,35 s à créer. La même texture est mise en cache avec once et partagée avec rep(). Ne pas générer une copie par objet.

Performances (RTX 4090, Chrome headless, exemple complet 1,1 s)

TextureTailleTempsScore de couture (x/y)
floorMaps2048² × 30,32 scouleur 0,96/1,10 ; normal 1,00/1,02 ; rugosité 0,89/1,05
woodMaps1024² × 30,20–0,23 scouleur 0,93/1,12 ; normal 1,30/1,06
wornMaps (1,2 × 0,6 m, 3400 px/m)4080×2040 + rugosité moitié0,13 snon répétable
oakVeneer1024² × 30,10 s0,98–1,06
wallNormal1024²0,04 s1,00/1,07
lacquerNormal, smudgeRough512²0,02–0,04 s0,98–1,04
7 types de tissus128²–512²1–19 ms0,94–1,10 (corde coton y = 2,03, rainure intentionnelle, voir verify-engines.md)
bookAtlas (12 livres)2048×15360,05–0,08 s—

Un score de couture proche de 1 signifie couture invisible ; au-dessus de 2, il faut vérifier. Le calcul ajoute 1 niveau de couleur au numérateur et au dénominateur pour éviter des ratios aberrants dans les directions où la texture a peu de variations (ex. bois filé droit).

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

threejs-photoreal-interior

用 three.js 從零做一個照片級的室內場景,完全用程式生成、不需要模型檔、貼圖或 HDRI 的總綱與起手式。內容包括:整體流程(尺寸與座標 → 外殼與窗 → 主角物件 → 材質 → 小物 → 烘焙光照 → 後製 → 驗證 → 電影輸出)、各步驟該用哪個 skill、跨 skill 整合的規則(決定性、細分、材質要經過 GI 補丁且保留原本的 shader 補丁、反照率、太陽直射與烘焙分工、陰影漏光)、一個指令就能建立可執行的新專案(房間、窗、木地板、牆面、桌椅、掛在椅背的毛巾、書架、杯子、水壺、現場烘焙、後製),以及驗收清單和實測數字。當使用者說「做一個寫實的房間/室內」「three.js 照片級場景」「程式生成整個場景」「不用模型做室內」「room-at-dawn 那種」「從哪裡開始做寫實 3D 場景」「開一個新的寫實場景專案」「把這些 skill 串起來」「寫實室內場景流程」時使用;做其中單一環節時,直接用對應的子 skill。

threejs-procedural-cloth

用程式「設計」出照片級的靜態布料(不做物理模擬):沒鋪好的棉被、毯子、桌巾、垂下床緣或桌緣的布、翻起一角的被子、布上放東西,以及掛在桿子上的窗簾(吊環夾出的折、往下鬆開與散開、綁起下擺、車線與雙層縫邊、亞麻平織)。方法是平面高度場(團塊+有方向的長折+削峰+逐條畫上的皺褶)→ 包到支撐物上 → 高的折往一側倒 → 翻角 → 依 3D 曲面攤平 UV → 細皺紋 normal map+凹處變暗,含可重用程式庫、分階段範例、驗證數據,以及搬到 Godot/Unreal 的做法。當使用者說「程式生成布料」「棉被/床單/毯子/桌巾建模」「布料皺褶」「布垂下床邊」「被子翻一角」「布料不要用模擬」「cloth without simulation」「procedural cloth」「布上的花紋被拉長」「布料看起來像塑膠/像山」「窗簾建模」「程式生成窗簾」「窗簾皺褶」「curtain」「布簾」時使用。

threejs-sky-backdrop

在 three.js 用程式做天空與窗外遠景,不需要 HDRI 或圖檔。天空的同一份參數同時用在三個地方:烘焙光照用的解析式天空、看得到的天空球(雲層、高空薄雲、地平線霧帶、太陽),以及不烘焙時用的太陽光、半球光與環境貼圖。內含四種預設(清晨、白天、陰天、黃昏)和一個量測工具,確認看到的天空和照亮場景的天空亮度一致。遠景部分包括:只建從室內窗戶看得到的東西(窗洞可見性與 LOD)、隨距離變淡的大氣霧化、遠處逐漸變粗的草地網格、碎石小路、樹籬、鄰居房子(陶瓦屋頂、窗戶、煙囪、天窗)、封住地平線的遠方樹牆,並可以搭配 threejs-procedural-vegetation 種樹。當使用者說「天空」「sky shader」「雲」「程式生成天空」「不用 HDRI」「窗外景色」「遠景」「背景房子」「地平線」「大氣透視」「霧化」「窗外的樹」「天空和光照對不上」「清晨/黃昏/陰天的天空」「只建看得到的東西」時使用。

Skills associés