Attribute 시스템
Dynamic Attribute 생성, 수학 연산, Attribute Noise, Partition 등 메타데이터 파이프라인을 마스터합니다.
Dynamic Attribute 생성
사용자 정의 속성을 포인트에 부여하기
Static Attribute($접두사) 외에도 사용자가 직접 Dynamic Attribute를 정의할 수 있습니다. 이를 통해 Biome 타입, 에셋 인덱스, 커스텀 가중치 등 프로젝트별 데이터를 포인트에 부여합니다.
Attribute 생성 노드
| 노드 | 기능 | 입력 타입 |
|---|---|---|
Add Attribute |
기존 데이터에 새 속성 추가. 상수 또는 다른 속성 기반 계산 | Point, Attribute Set |
Create Attribute |
새 Attribute Set을 생성하며 속성 추가 | 없음 (독립 생성) |
Copy Attribute |
기존 속성을 새 이름으로 복사 | Point, Attribute Set |
Attribute Rename |
속성 이름 변경 | Point, Attribute Set |
Delete Attributes |
불필요한 속성 제거 (메모리 절약) | Point, Attribute Set |
// 높이 기반 Biome 타입 부여 워크플로우
[Surface Sampler]
↓
[Add Attribute]
Output Attribute: "BiomeType"
Input Source: "$Position.Z" // Z 높이 기반
Operation: Custom Expression
↓
// BiomeType 값:
// Z < 500 → 0 (평원)
// Z 500~1500 → 1 (산림)
// Z > 1500 → 2 (설산)
↓
[Attribute Partition]
Partition Attribute: "BiomeType"
↓
// BiomeType별로 분리된 데이터 → 각각 다른 메시 스포너로
수학 연산 노드
Attribute 값에 대한 사칙연산, 비교, 벡터 연산
PCG는 풍부한 수학 연산 노드를 제공합니다. Attribute 값을 기반으로 새로운 값을 계산하고, 조건을 평가하며, 벡터/회전 연산을 수행할 수 있습니다.
기본 수학 연산
| 카테고리 | 주요 노드 | 용도 예시 |
|---|---|---|
| 산술 | Add, Subtract, Multiply, Divide, Modulo | 밀도 조절, 스케일 계산 |
| 범위 | Clamp, Min, Max, Lerp, Abs | 값 제한, 보간 |
| 비교 | Equal, Greater, Less, GreaterOrEqual | 조건 분기용 Boolean 생성 |
| 삼각함수 | Sin, Cos, Atan2, DegToRad | 원형 배치, 방향 계산 |
| 벡터 | Cross, Dot, Distance, Normalize, Length | 방향 판단, 거리 기반 필터 |
| Reduce | Average, Min, Max (전체 데이터) | 통계값 계산, 정규화 기준 |
// 중심점에서 멀어질수록 크기가 작아지는 패턴
[Surface Sampler]
↓
[Distance] // 중심점(0,0,0)까지 거리 계산
Source: Surface Sampler 출력
Target: [Create Points] (0,0,0)
Output Attribute: "DistToCenter"
↓
[Divide] // 정규화 (최대 거리로 나누기)
Input A: "DistToCenter"
Input B: 5000 // 최대 거리
Output: "NormDist"
↓
[One Minus] // 반전 (가까울수록 값이 큼)
Input: "NormDist"
Output: "ScaleFactor"
↓
[Clamp] // 0.3 ~ 1.0 범위로 제한
Input: "ScaleFactor"
Min: 0.3
Max: 1.0
Attribute Noise
노이즈 함수로 속성 값에 자연스러운 변이 추가
Attribute Noise(Density Noise)는 Perlin, Simplex 등의 노이즈 함수를 사용하여 Attribute 값에 공간적으로 일관된 변이를 추가합니다. 자연스러운 분포 패턴 생성의 핵심 도구입니다.
| 파라미터 | 설명 | 효과 |
|---|---|---|
Mode |
Set, Add, Multiply | 기존 값에 노이즈를 적용하는 방식 |
Noise Min/Max |
노이즈 출력 범위 | 밀도 범위 제어 |
Cell Size |
노이즈 셀 크기 (cm) | 작으면 세밀한 변화, 크면 넓은 영역 변화 |
Voronoi |
Voronoi 노이즈 사용 | 셀 기반 패턴 (군집 효과) |
Spatial Noise는 별도 노드로, 포인트 위치 기반의 다층 노이즈 값을 새 Attribute로 생성합니다. Attribute Noise는 기존 Attribute 값을 수정합니다. 복잡한 분포에는 Spatial Noise로 값을 생성한 뒤 수학 노드로 가공하는 것이 더 유연합니다.
Attribute Partition
속성 값에 따라 데이터를 분리하기
Attribute Partition은 지정된 Attribute의 고유 값에 따라 데이터를 여러 그룹으로 분할합니다. 각 그룹은 별도의 출력으로 전달되어 독립적으로 처리할 수 있습니다.
// Attribute Partition으로 식생 타입별 분리 처리
[Surface Sampler]
↓
[Add Attribute] // "VegetationType" = Hash($Seed) % 3
↓
[Attribute Partition]
Partition Attribute: "VegetationType"
↓
// 결과: 3개의 독립 데이터 스트림
//
// VegetationType=0 → [Transform] → [Spawner: 활엽수]
// VegetationType=1 → [Transform] → [Spawner: 침엽수]
// VegetationType=2 → [Transform] → [Spawner: 관목]
Match And Set Attributes
Match And Set은 Lookup Table 패턴으로, 하나의 Attribute 값을 기준으로 다른 Attribute Set에서 매칭되는 값을 찾아 복사합니다.
// DataTable 기반 에셋 매핑
[Load Data Table] // BiomeAssetMapping 테이블
// | BiomeID | MeshPath | ScaleMin | ScaleMax |
// | 0 | SM_GrassClump_01 | 0.5 | 1.0 |
// | 1 | SM_OakTree_01 | 0.8 | 1.2 |
// | 2 | SM_PineTree_01 | 0.9 | 1.5 |
[Match And Set Attributes]
Match Attribute: "BiomeType" // 포인트의 BiomeType으로
Index Attribute: "BiomeID" // DataTable의 BiomeID와 매칭
// → MeshPath, ScaleMin, ScaleMax가 포인트에 복사됨
Attribute Partition은 데이터를 복제하지 않고 참조로 분할합니다. 하지만 파티션 수가 많으면 후속 노드가 여러 번 실행되므로, 불필요하게 세분화하지 않도록 주의하세요.
핵심 요약
- Dynamic Attribute는 Add Attribute 노드로 포인트에 사용자 정의 속성을 부여한다
- PCG는 산술, 비교, 삼각함수, 벡터 등 풍부한 수학 연산 노드를 제공한다
- Attribute Noise와 Spatial Noise로 공간적으로 일관된 자연스러운 변이를 만든다
- Attribute Partition은 속성 값 기반으로 데이터를 그룹 분할하여 독립 처리할 수 있다
- Match And Set으로 DataTable을 Lookup Table처럼 활용하여 에셋을 매핑할 수 있다
- 불필요한 Attribute는 Delete Attributes로 제거하여 메모리를 절약한다
도전 과제
배운 내용을 직접 실습해보세요
Create Attribute 노드로 커스텀 float Attribute(TreeAge, MoistureLevel)를 생성하세요. Attribute Noise를 적용한 뒤 메시 스케일과 머티리얼 파라미터를 변경하세요.
Attribute Operation으로 속성 값을 연산하고, Attribute Filter로 특정 조건(TreeAge > 50)을 만족하는 포인트만 선택하세요. 오래된 나무는 크게, 어린 나무는 작게 배치하세요.
습도, 일조량, 토양 3가지 Attribute를 지형에서 파생하고, 이 속성 조합으로 식물 종류를 결정하는 PCG 생태계를 구현하세요. 성장 단계도 Attribute로 표현하세요.