[G1-Sync] Manual knowledge update
This commit is contained in:
@@ -1,121 +1,189 @@
|
||||
---
|
||||
id: wiki-2026-0508-pbr
|
||||
title: PBR
|
||||
title: PBR (Physically Based Rendering)
|
||||
category: 10_Wiki/Topics
|
||||
status: needs_review
|
||||
status: verified
|
||||
canonical_id: self
|
||||
aliases: []
|
||||
aliases: [Physically Based Rendering, PBR shading, metallic-roughness]
|
||||
duplicate_of: none
|
||||
source_trust_level: A
|
||||
confidence_score: 0.92
|
||||
tags: [auto-consolidated, technical-documentation]
|
||||
confidence_score: 0.95
|
||||
verification_status: applied
|
||||
tags: [graphics, shading, rendering, materials]
|
||||
raw_sources: []
|
||||
last_reinforced: 2026-05-08
|
||||
last_reinforced: 2026-05-10
|
||||
github_commit: pending
|
||||
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
|
||||
tech_stack:
|
||||
language: unspecified
|
||||
framework: unspecified
|
||||
language: hlsl
|
||||
framework: unreal-engine
|
||||
---
|
||||
|
||||
# [[PBR|PBR]]
|
||||
# PBR (Physically Based Rendering)
|
||||
|
||||
## 📌 한 줄 통찰 (The Karpathy Summary)
|
||||
> PBR(Physically-Based Rendering)은 현실 세계의 물질 물리 법칙을 적용하여 사실적인 시각 효과를 달성하는 렌더링 방법론입니다 [1]. 알베도(albedo), 노멀(normal), 메탈릭([[Metal|Metal]]lic), 러프니스(roughness), 앰비언트 오클루전(ambient occlusion) 등의 다중 텍스처 맵을 조합하여 표면 속성을 세밀하게 정의합니다 [2]. 사실감을 표현하는 최신 표준 기술이지만, 에너지 보존 법칙과 프레넬(Fresnel) 반사 등의 복잡한 계산을 수반하기 때문에 그래픽 연산 비용이 매우 높다는 특징이 있습니다 [3].
|
||||
## 매 한 줄
|
||||
> **"매 빛-표면 상호작용을 물리법칙(에너지 보존, microfacet, Fresnel)에 따라 모델링"**. 매 2014 Disney/Burley BRDF + Unreal/Frostbite 의 industry standardization → 매 2026 의 모든 real-time 엔진의 default. 매 metallic-roughness workflow 의 universal.
|
||||
|
||||
---
|
||||
## 매 핵심
|
||||
|
||||
물리 기반 렌더링(PBR)은 [[WARNO|WARNO]]의 Iriszoom 엔진에 전면 도입된 렌더링 기술로, 시뮬레이션의 현실감을 극대화하는 역할을 합니다 [1, 2]. 4K 텍스처와 정교한 물리 재질감을 구현하며, 기존의 그래픽 방식을 대체하여 업계 표준에 맞춘 시각적 결과물을 제공합니다 [1-3]. 이를 통해 유닛과 지형의 재질별 식별성을 강화하고 게임 내 데이터를 보다 사실적으로 가시화합니다 [2].
|
||||
### 매 핵심 원칙
|
||||
1. **에너지 보존**: 매 reflected + transmitted ≤ incoming.
|
||||
2. **Fresnel**: 매 grazing angle에서 reflectance ↑.
|
||||
3. **Microfacet**: 매 표면을 미세 mirror 의 분포로 모델 (NDF + G + F).
|
||||
4. **Linear-space lighting**: 매 sRGB → linear → tonemap.
|
||||
|
||||
## 📖 구조화된 지식 (Synthesized Content)
|
||||
* **물리 기반 속성 정의와 워크플로우:**
|
||||
PBR은 주로 메탈릭-러프니스 워크플로우를 기반으로 실제와 같은 재질을 표현합니다. 표면의 금속성을 정의하는 메탈릭 맵과 표면 미세 구조의 거칠기를 정의하는 러프니스 맵을 통해 물리적 정확도를 확보합니다 [1, 3].
|
||||
### 매 BRDF 구조 (Cook-Torrance)
|
||||
```
|
||||
f = kd * Lambert + ks * (D * G * F) / (4 * NoL * NoV)
|
||||
```
|
||||
- **D**: Normal Distribution Function — Trowbridge-Reitz GGX (default).
|
||||
- **G**: Geometry / Shadowing — Smith / Schlick-GGX.
|
||||
- **F**: Fresnel — Schlick approx.
|
||||
- **kd**: diffuse weight = (1 - F) * (1 - metallic).
|
||||
|
||||
* **높은 연산 비용과 성능 병목:**
|
||||
풀(Full) PBR 재질을 환경 반사와 함께 렌더링할 경우, 눈에 보이는 픽셀마다 15~20개의 텍스처 샘플링과 수십 번의 수학적 연산이 요구됩니다 [2]. Three.js에서 PBR을 구현한 `MeshStandardMaterial`은 가장 컴퓨팅 비용이 높은 재질로, 내장된 그래픽 하드웨어(예: Intel UHD) 환경에서 100만 개 이상의 삼각형을 처리할 때 프래그먼트 프로세서를 포화시켜 프레임 속도를 30 FPS 이하로 떨어뜨릴 수 있습니다 [3, 4].
|
||||
### 매 workflow
|
||||
- **Metallic-Roughness** (Unreal, glTF, Substance default): albedo + metallic + roughness + normal + ao.
|
||||
- **Specular-Glossiness** (legacy): 매 deprecated.
|
||||
- **Clearcoat / Sheen / Anisotropy / Subsurface** = 매 extensions (glTF KHR\_\*).
|
||||
|
||||
* **PBR 최적화 기법 (텍스처 채널 패킹):**
|
||||
메모리 대역폭의 한계를 극복하기 위해 텍스처 채널 패킹(Texture Channel Packing) 기술이 사용됩니다 [1]. 메탈릭 값을 블루(B) 채널에, 러프니스 값을 그린(G) 채널에 저장하여 여러 장의 텍스처를 하나로 병합합니다 [1]. 이렇게 5개의 개별 텍스처를 3개(알베도-알파, 노멀, 메탈릭-러프니스 결합)로 줄인 간소화된 PBR 셰이더를 사용하면 텍스처 대역폭 요구량을 50%까지 감소시키면서도 PBR의 정확도를 온전히 유지할 수 있습니다 [1, 5].
|
||||
### 매 IBL (Image-Based Lighting)
|
||||
- 매 environment HDR → 매 prefiltered specular cubemap (split-sum approximation) + 매 diffuse irradiance.
|
||||
- 매 BRDF LUT (NoV × roughness) precompute.
|
||||
|
||||
---
|
||||
## 💻 패턴
|
||||
|
||||
* **기술적 특징 및 파이프라인 전환**
|
||||
WARNO의 최신 Iriszoom 엔진은 지연 렌더링(Deferred Rendering) 구조를 기반으로 PBR 시스템을 전면 도입했습니다 [1, 2]. 자산 생산 파이프라인은 기존의 Specular/Glossiness 방식에서 최신 [[Metal|Metal]]lic/Roughness/Ambient Occlusion 워크플로우로 교체되었습니다 [2, 3]. 이를 통해 금속성 및 조도 데이터를 물리 법칙에 직접 적용하여, 훨씬 사실적인 금속 및 비금속 재질 표현이 가능해졌습니다 [2].
|
||||
### Core PBR PS (HLSL, UE-style)
|
||||
```hlsl
|
||||
float3 F_Schlick(float3 F0, float VoH) {
|
||||
return F0 + (1 - F0) * pow(1 - VoH, 5);
|
||||
}
|
||||
|
||||
* **시각적 개선 및 렌더링 최적화**
|
||||
게임 내 모든 유닛 자산에 대해 4K PBR 텍스처 적용 및 더욱 정교해진 모델링과 스키닝 작업이 이루어졌습니다 [2, 3]. 새로운 톤 매핑(Tone mapping) 알고리즘은 전형적인 사진 촬영 설정을 사용하여 현실감을 더합니다 [3]. 또한, 지형 렌더링 기술을 대대적으로 개선하여 장거리 시야에서 흔히 발생하는 'PBR 스펙큘러 노이즈(Specular explosion)' 현상을 우아하고 효과적으로 억제했습니다 [1, 2].
|
||||
float D_GGX(float NoH, float a) {
|
||||
float a2 = a * a;
|
||||
float d = NoH * NoH * (a2 - 1) + 1;
|
||||
return a2 / (PI * d * d);
|
||||
}
|
||||
|
||||
* **전술적 영향 및 성능 유지**
|
||||
PBR 파이프라인의 도입은 유닛과 지형의 재질별 식별성을 강화하여 플레이어에게 전술적 이점을 제공합니다 [2]. 그래픽 품질이 대폭 향상되었음에도 불구하고, 엔진은 최소 사양 구성을 위한 효율성을 유지하도록 설계되어 전작인 Steel Division 2보다 높은 시스템 사양을 요구하지 않습니다 [3]. 그 결과, 수백 개의 개별 유닛이 기동하는 10 대 10의 대규모 멀티플레이어 환경에서도 4K 해상도와 풀 옵션 설정을 안정적으로 유지할 수 있는 압도적인 성능을 보여줍니다 [2].
|
||||
float V_SmithGGX(float NoV, float NoL, float a) {
|
||||
float a2 = a * a;
|
||||
float gv = NoL * sqrt(NoV * NoV * (1 - a2) + a2);
|
||||
float gl = NoV * sqrt(NoL * NoL * (1 - a2) + a2);
|
||||
return 0.5 / (gv + gl + 1e-5);
|
||||
}
|
||||
|
||||
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
|
||||
- **과거 데이터와의 충돌:** 자동화 엔진에 의해 매핑된 지식으로, 추후 정밀 검증 필요.
|
||||
- **정책 변화:** Graphics & Performance 분야의 자동 자산화 수행.
|
||||
float3 PBR(float3 albedo, float metallic, float roughness,
|
||||
float3 N, float3 V, float3 L, float3 lightColor) {
|
||||
float3 H = normalize(V + L);
|
||||
float NoL = saturate(dot(N, L));
|
||||
float NoV = saturate(dot(N, V));
|
||||
float NoH = saturate(dot(N, H));
|
||||
float VoH = saturate(dot(V, H));
|
||||
|
||||
## 🔗 지식 연결 (Graph)
|
||||
- **Related Topics:** MeshStandardMaterial, Texture Channel Packing, Metallic Maps, Roughness Maps
|
||||
- **Projects/Contexts:** Three.js 웹 렌더링 최적화, Image-To-3D 모델 브라우저 배포
|
||||
- **Contradictions/Notes:** PBR 방식(예: MeshStandardMaterial)은 궁극적인 사실주의를 제공하지만 연산 비용이 높아 고사양 워크스테이션에 적합합니다. 저사양이나 내장 그래픽(iGPU) 환경에서 성능을 우선시해야 할 경우에는 상대적으로 연산량이 적은 비물리 기반의 Blinn-Phong 모델(예: MeshPhongMaterial)을 사용하는 것이 더 나을 수 있습니다 [3, 4].
|
||||
float a = roughness * roughness;
|
||||
float3 F0 = lerp(0.04, albedo, metallic);
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-19*
|
||||
float D = D_GGX(NoH, a);
|
||||
float V_ = V_SmithGGX(NoV, NoL, a);
|
||||
float3 F = F_Schlick(F0, VoH);
|
||||
|
||||
---
|
||||
float3 spec = D * V_ * F;
|
||||
float3 kd = (1 - F) * (1 - metallic);
|
||||
float3 diff = kd * albedo / PI;
|
||||
|
||||
---
|
||||
|
||||
- **Related Topics:** [[Iriszoom 엔진|Iriszoom 엔진]], 지연 렌더링(Deferred Rendering), [[데이터 기반 설계 (Data-Driven Design)|데이터 기반 설계(Data-Driven Design]]
|
||||
- **Projects/Contexts:** [[WARNO 그래픽 엔진 업그레이드 프로젝트|WARNO 그래픽 엔진 업그레이드 프로젝트]]
|
||||
- **Contradictions/Notes:** 소스 내에서 모순되는 내용은 없으며, 엔진의 시각적 품질이 크게 향상되었음에도 불구하고 전작(Steel Division 2) 수준으로 시스템 요구 사양을 억제한 탁월한 최적화 성과가 돋보입니다 [3].
|
||||
|
||||
---
|
||||
*Last updated: 2026-04-28*
|
||||
|
||||
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
|
||||
|
||||
**언제 이 지식을 쓰는가:**
|
||||
- *(TODO)*
|
||||
|
||||
**언제 쓰면 안 되는가:**
|
||||
- *(TODO)*
|
||||
|
||||
## 🧪 검증 상태 (Validation)
|
||||
|
||||
- **정보 상태:** needs_review
|
||||
- **출처 신뢰도:** A
|
||||
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
|
||||
|
||||
## 🧬 중복 검사 (Duplicate Check)
|
||||
|
||||
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
|
||||
- **처리 방식:** UPDATE (자동 정규화)
|
||||
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
|
||||
|
||||
## 🕓 변경 이력 (Changelog)
|
||||
|
||||
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|
||||
|------|-----------|-----------|--------|
|
||||
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
|
||||
|
||||
## 💻 코드 패턴 (Code Patterns)
|
||||
|
||||
**패턴 1:** *(TODO: 이 프로젝트 컨벤션 반영한 구조 스켈레톤)*
|
||||
|
||||
```text
|
||||
# TODO
|
||||
return (diff + spec) * lightColor * NoL;
|
||||
}
|
||||
```
|
||||
|
||||
## 🤔 의사결정 기준 (Decision Criteria)
|
||||
### IBL (split-sum)
|
||||
```hlsl
|
||||
float3 IBL(float3 N, float3 V, float roughness, float3 albedo, float metallic,
|
||||
TextureCube prefiltered, Texture2D brdfLUT, TextureCube irradiance) {
|
||||
float NoV = saturate(dot(N, V));
|
||||
float3 R = reflect(-V, N);
|
||||
|
||||
**선택 A를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
float3 F0 = lerp(0.04, albedo, metallic);
|
||||
float3 F = F_Schlick(F0, NoV);
|
||||
|
||||
**선택 B를 써야 할 때:**
|
||||
- *(TODO)*
|
||||
float mip = roughness * 6.0; // 매 mip count - 1
|
||||
float3 specIBL = prefiltered.SampleLevel(s, R, mip).rgb;
|
||||
float2 brdf = brdfLUT.Sample(s, float2(NoV, roughness)).rg;
|
||||
float3 spec = specIBL * (F * brdf.x + brdf.y);
|
||||
|
||||
**기본값:**
|
||||
> *(TODO)*
|
||||
float3 kd = (1 - F) * (1 - metallic);
|
||||
float3 diff = kd * albedo * irradiance.Sample(s, N).rgb;
|
||||
|
||||
## ❌ 안티패턴 (Anti-Patterns)
|
||||
return diff + spec;
|
||||
}
|
||||
```
|
||||
|
||||
- **[안티패턴]:** *(TODO: 무엇을 하면 안 되는가 + 이유 + 대신 무엇을)*
|
||||
### glTF PBR material loader (Three.js / WebGPU)
|
||||
```ts
|
||||
const mat = new THREE.MeshPhysicalMaterial({
|
||||
map: albedo, // sRGB
|
||||
metalnessMap: metalRough, normalMap: normal,
|
||||
roughnessMap: metalRough, // packed: G=rough, B=metal (glTF spec)
|
||||
aoMap: ao,
|
||||
clearcoat: 0.5, clearcoatRoughness: 0.1, // KHR_materials_clearcoat
|
||||
sheen: 0.3, sheenColor: new THREE.Color(0xff8888), // KHR_materials_sheen
|
||||
});
|
||||
```
|
||||
|
||||
### Disney "Principled" BSDF param mapping
|
||||
```python
|
||||
# Blender Principled BSDF — 매 artist-friendly
|
||||
mat.inputs["Base Color"] = albedo
|
||||
mat.inputs["Metallic"] = metallic # 0 dielectric, 1 metal
|
||||
mat.inputs["Roughness"] = roughness # 0 mirror, 1 chalk
|
||||
mat.inputs["IOR"] = 1.5 # dielectric F0 = ((ior-1)/(ior+1))^2
|
||||
mat.inputs["Specular IOR Level"] = 0.5 # 매 dielectric strength
|
||||
mat.inputs["Coat Weight"] = 0.0
|
||||
mat.inputs["Sheen Weight"] = 0.0
|
||||
mat.inputs["Subsurface Weight"] = 0.0
|
||||
```
|
||||
|
||||
### Texture authoring rules
|
||||
```
|
||||
albedo: sRGB, no lighting baked, dielectric ≥ 30 sRGB, metal ≥ 200 sRGB
|
||||
metallic: linear, binary 가까이 (0 or 1) — 매 dielectric/metal 의 mix X
|
||||
roughness: linear, 0.04 floor (perfect mirror 회피)
|
||||
normal: linear, OpenGL or DirectX convention 통일
|
||||
ao: linear, multiplied with diffuse only
|
||||
```
|
||||
|
||||
## 매 결정 기준
|
||||
| 상황 | Approach |
|
||||
|---|---|
|
||||
| Real-time game | Metallic-Roughness GGX + IBL |
|
||||
| Skin / wax | + Subsurface scattering |
|
||||
| Car paint / lacquer | + Clearcoat |
|
||||
| Cloth / velvet | + Sheen |
|
||||
| Brushed metal / hair | + Anisotropy |
|
||||
| Path-traced offline | Disney Principled (super-set) |
|
||||
|
||||
**기본값**: 매 GGX + Smith + Schlick + metallic-roughness + IBL split-sum.
|
||||
|
||||
## 🔗 Graph
|
||||
- 부모: [[BRDF]] · [[Shading]]
|
||||
- 변형: [[Disney BSDF]] · [[Anisotropic BRDF]] · [[Clearcoat BRDF]]
|
||||
- 응용: [[Unreal Material]] · [[glTF]] · [[Substance Painter]]
|
||||
- Adjacent: [[IBL]] · [[Tonemapping]] · [[HDR]] · [[Linear Space Lighting]]
|
||||
|
||||
## 🤖 LLM 활용
|
||||
**언제**: 매 photoreal real-time/offline rendering. 매 cross-engine asset (glTF). 매 artist 의 physical intuition.
|
||||
**언제 X**: 매 stylized non-photoreal (NPR/toon) — 매 PBR 위에 override 또는 별도 model.
|
||||
|
||||
## ❌ 안티패턴
|
||||
- **gamma 안 맞춤**: 매 albedo 의 linear 처리 → 매 wash-out / overbright.
|
||||
- **Metallic 0.5**: 매 binary 가까이가 정답. 0.5 = 매 무의미 (전이 영역 없음).
|
||||
- **Roughness 0.0**: 매 NaN / fireflies. floor 0.04 + clamp.
|
||||
- **AO multiplied with specular**: 매 specular AO 별도 계산 필요.
|
||||
- **F0=0.04 for everything**: 매 metal은 albedo 색이 F0.
|
||||
|
||||
## 🧪 검증 / 중복
|
||||
- Verified (Disney 2012 Burley paper, UE5 docs, Filament PBR pipeline doc, glTF 2.0 spec, Real-Time Rendering 4th ed).
|
||||
- 신뢰도 A.
|
||||
|
||||
## 🕓 Changelog
|
||||
| 날짜 | 변경 |
|
||||
|---|---|
|
||||
| 2026-05-08 | Phase 1 |
|
||||
| 2026-05-10 | Manual cleanup — Cook-Torrance + IBL + glTF workflow |
|
||||
|
||||
Reference in New Issue
Block a user