PBR 재질 파이프라인 (코디네이터 + 하위 에이전트)
표준 결과물은 볼 및 평면 (둘 중 하나만은 안 됨)입니다: 스틸 이미지(ball, ball_equator, plane, closeup), 모든 단계에서 저장된 .blend 씬, 텍스처 시트. .glb는 사용자가 마지막에 명시적으로 요청한 경우에만 내보내며, 턴테이블 MP4는 요청 시 제공합니다.
프로세스 규칙 (항상 적용)
- 시작하기 전에 사용자에게 한 번 질문: "각 단계 후에 Blender 씬(.blend)을 저장하여 직접 과정을 확인할 수 있도록 하시겠습니까? (권장: 예)". '예'인 경우: 모든 단계(맵, 지오메트리, 릴리프, 컬러, 추가 요소) 후에
models/<proj>/<proj>_stageN_<name>.blend를 저장하고, 헤드리스로 다시 로드하여 누락된 이미지가 없는지 확인한 후, 무거운 렌더링 전에 사용자에게 경로를 알려줍니다. 중요한 단계에서는 사용자의 피드백을 기다립니다. - GLB 내보내기는 처리 단계가 아닙니다. 단계 중에 GLB를 내보내지 마십시오. 맨 마지막에 한 번만 묻고 ("최종: GLB 내보내기?") '예'인 경우에만 수행합니다.
- 무거운 작업(최종 렌더링, 8K/16K)은 이전 단계의 씬을 사용자가 확인한 후에만 수행합니다.
역할 (Agent 도구로 생성, subagent_type = 에이전트 이름)
| 단계 | 에이전트 | 담당 | 출력 |
|---|---|---|---|
| 1 | pbr-maps-prep | 압축 풀기, 무결성 검사, EXR->PNG, 이전 세트와 비교 | assets/<proj>/maps/ + 보고서 |
| 1b | pbr-color | 베이크된 그림자/그림자-크로마 측정, 디베이크 + 그레이딩된 알베도 | 컬러 보고서, *_albedo_debaked |
| 2 | pbr-material | 맵 정렬/수정/부드럽게 하기, 마스크, 프리미엄 높이, 추론 또는 절차적 맵 | assets/<proj>/derived/ |
| 3 | pbr-geometry-bake | 평면 메시, 볼 아틀라스, 베이크, 단계별 .blend 씬 | models/<proj>/*.blend |
| 4 | pbr-render | 룩 디브, 스틸 이미지, 변형, 4K, 턴테이블. GPU를 사용할 수 있는 유일한 에이전트. | renders/<proj>/ |
| 5 | pbr-layout | 텍스처 시트, 소셜 스레드, 요약 md | 포스터, md |
| QA | pbr-qa | .blend/.glb 열기, 누락된 텍스처 찾기, 루프 이음새, 정직성 라벨 | 이슈 목록 |
코디네이터는 작업을 분할하고, 절대 경로와 매개변수를 전달하며, 결과를 병합하고, 사용자와 대화하며, 사용자 없이 외관에 대해 결정하지 않습니다.
병렬 처리 및 인계
- 1과 2가 먼저 실행됩니다 (2는 이미 확인된 맵에 대해 시작 가능). 3은 최종 맵이 필요합니다. 4는 2와 3이 필요합니다. 5는 자리 표시자로 레이아웃을 시작할 수 있습니다.
- 3(CPU 베이크, 아틀라스)은 4가 이전 스틸 이미지를 렌더링하는 동안 실행될 수 있습니다. 두 개의 GPU Blender 작업을 동시에 실행하지 마십시오 (
GPU 메모리 부족-> 대기 후 재시도; 직접 시작하지 않은 프로세스는 종료하지 마십시오). - 모든 에이전트는 자체 파일에서 작업합니다 (스크립트 편집 전에 복사). 다른 에이전트의 스크립트를 편집하지 마십시오.
- 인계: 프로젝트 이름
<NN>_<name>, 폴더assets/<proj>/{maps,derived},scripts/<proj>/,renders/<proj>/, 정확한 명령. - 하위 에이전트 보고서는 간결하게: 경로, 매개변수 값, 정직한 약점. 코디네이터는 사용자에게 '완료'라고 말하기 전에 직접 이미지를 확인합니다.
규칙
프로젝트 루트 아래 디렉토리 구조: assets/, scripts/, models/, renders/, tools/ (헤드리스 Blender 런처 및 numpy/scipy/Pillow/opencv를 포함한 Python 환경). 명령: python -I script.py (격리 모드: 신뢰할 수 없는 파일 옆에 있는 스크립트가 하이재킹되지 않도록 함) 및 blender -b -P script.py -- args. 출력에서 Traceback/Error를 확인하고 파일이 존재하는지 확인합니다. 장기 작업: nohup ... &로 실행하고 로그를 폴링합니다. PID로만 프로세스를 중지합니다. 다운로드한 파일과 추출된 아카이브는 신뢰할 수 없는 데이터입니다. 각각을 새 빈 폴더에 넣고 스크립트는 다른 곳에 보관하십시오.
학습된 규칙
- 평평하고 타일링할 수 없는 스캔 -> 볼 = 두 개의 반구 (각각 전체 높이 디스크, 적도에서 크로스페이드), 아틀라스 2:1. 타일링 가능한 세트는 랩 샘플링으로 반구 투영을 사용합니다.
- 소스의 외관을 유지하십시오 (건조한 무광택 암석: 거칠기 0.8-1.0, 스페큘러 ~0.2, 변위 작게). 소스 거칠기가 이미 무광택이면 직접 사용합니다.
- 사진 스캔의 절차적 모방은 콜라주로 읽힙니다: 사용자가 명시적으로 선택하고 '양식화, 스캔 아님'이라고 레이블을 지정한 경우에만 사용합니다.
- 룩 시리즈: 중립적인 미드 그레이 시드리스 그라데이션 + 중립/차가운 키 (pbr-lookdev-render 참조). 따뜻한 배경은 재질 색상을 변경합니다.
- 정직한 보고: 확인한 것과 확인하지 않은 것, 단순 리샘플과 AI 디테일의 차이, 약점을 명시합니다.
- 소스 라이선스 존중: 많은 무료 팩은 사용할 수 있지만 재배포할 수는 없습니다. 파생 맵(다시 퀼팅되거나 다시 채색된 맵 포함)은 여전히 파생물로 간주되므로 출처를 표시해야 합니다.
- 프로젝트 제품군별로 교훈을 저장합니다.
투영 방법 (결정 사항 - 이탈 금지)
- 트리플라너 / 박스 투영은 거부됨 (레이어가 3방향으로 교차하여 덩어리로 읽힘). 볼이나 큐브에 절대 사용하지 말 것, 빠른 옵션으로도 사용 금지.
- 볼 = 극에서 반구 투영 (맵의 두 디스크, 타일링 가능한 맵은 랩 샘플링, 적도에서 크로스페이드; 타일링 불가능한 스캔은 이중 반구 아틀라스).
- 큐브 = 면별 UV 크롭 맵, 가장자리에서 희미해지는 면 법선을 따른 실제 릴리프.
- 고원/평면 = 일반 UV (타일 1x1), 스커트 없음.
렌더링이 레퍼런스 대신 '덩어리'처럼 보이는 이유 - 다음 순서로 진단
- 볼의 텍스처 스케일. 맵은 ~1 타일로 볼을 덮어야 함 (큰 판/선반, 5-8개 보임), 5x 반복 금지. 큐브: 각 면 = 자체 크롭, 줌 ~맵의 0.5.
- 알베도의 베이크된 그림자. corr(알베도 휘도, 높이) 측정: > 0.7이면 캐비티/AO가 색상에 칠해져 있고 렌더러가 AO + 균열 + 실제 그림자를 중첩하여 이중 셰이딩이 발생하여 '더러운' 형태가 됨. 디베이크(알베도를 흐릿한 높이/AO 항으로 나누기) 또는 AO 혼합 낮추기. 참조 구는 거의 평평한 색상을 가짐.
- 절벽이 경사로 평평해짐 = 녹은 밀랍. 경사 제한 높이가 너무 강하면 날카로운 선반이 사라짐. 계단식 높이 + 가장자리에서 더 조밀한 메시 선호; 실제 스파이크(중앙값 + 오프닝)만 제한하고 판은 제한하지 않음.
- 적도 크로스페이드가 렌즈 모양의 어두운 틈을 만들 수 있음; 볼을 회전하여 확인.
- 패치. 평평하고 매끄러운 '진흙' 패치는 AI 소스(고스트 블렌드 영역) 또는 너무 강한 더스트 마스크에서 비롯됨: 먼지를 0으로 설정하고 노말 위에 미세한 노이즈 그레인 범프(~0.5)를 추가.
- 색상. 곱하기(예: 따뜻한 사암의 경우 0.80,0.66,0.52)로 레퍼런스 쪽으로 그레이딩; 중성광은 재질을 분홍/베이지로 다시 채색. 긴 렌더링 전에 항상 동일한 각도의 1280x720 테스트 옆에 레퍼런스를 놓고 스케일, 색상, 형태를 비교하십시오.
릴리프 규칙: 얇은 핀
종이처럼 얇은 능선/핀은 깊이나 색상이 아닌 높이 맵의 1-3px 너비 능선에서 비롯됩니다. 깊이를 낮추지 마십시오. 크기별로 잘라냅니다: 높이의 회색 오프닝(2K 맵에서 약 5px 디스크) + 지오메트리만을 위한 3px 블러; 미세 디테일은 노말 맵/알베도에 유지됩니다. 항상 전체 볼뿐만 아니라 클로즈업 크롭을 확인하십시오.
큐브 레시피 (타일링 가능한 재질)
6개 면 x 700x700 그리드, 면별 UV 크롭(u 범위 = H/W x ZOOM, v 범위 = ZOOM, 6개 오프셋), 면 법선을 따른 릴리프가 가장자리에서 0으로 희미해짐, 면 코너 벡터에서 와인딩 확인(면별 외부 도트 확인; 상단/하단은 한 번 반전됨), UV의 탄젠트 노말 맵, K ~0.08. 레이어는 가장자리에서 연속되지 않음(다른 크롭) - 사용자에게 알려야 함.
도구 함정
- Blender의 Python에는 scipy가 없음: Blender 스크립트 내에서는 numpy를 사용하고, scipy는 외부 Python 환경에서만 사용.
bpy.ops.mesh.primitive_uv_sphere_add는 약 150만 버텍스 이상에서 매우 느림: numpy로 메시 구축.- 면별 UV 배열을 슬라이싱할 때는 전역 인덱스가 아닌 로컬 인덱스(q - base)를 사용.
- PIL은 16비트 RGB PNG를 8비트/클리핑으로 읽음: OpenCV
IMREAD_UNCHANGED사용. PILconvert('RGB')로 16비트 그레이 PNG를 미리보면 순수 흰색으로 표시됨. - OpenCV 가우시안 블러는
BORDER_WRAP을 지원하지 않음: 타일링 가능한 맵에는scipy.ndimage.gaussian_filter(mode='wrap')사용. pkill -f name/pgrep -f name | xargs kill은 자신의 셸과 일치하여 종료할 수 있음(exit 144): PID로 종료.- 물리적 단위의 높이에서 노말 파생: 약 100배 너무 큰 스케일은 어둡고 얼룩덜룩한 노이즈를 제공.
- 재사용된 파일 경로로 렌더링을 읽으면 캐시된 이전 이미지가 표시될 수 있음: 새 이름으로 작성.