# Render - 렌더링 서브시스템
**"화면에 그리기"**를 담당하는 통합 렌더링 계층입니다.
## 📦 모듈 구성
### `system.rs`
- **`RenderSystem`**: 렌더링의 최상위 조율자
- GPU 초기화, 파이프라인 생성, 렌더링 실행
- `core::System` trait 구현 (Engine이 직접 소유)
```rust
let mut render_system = RenderSystem::new();
render_system.initialize(window).await?;
render_system.render(&world, &asset_manager)?;
```
### `gpu/` - GPU 추상화
GPU 기반 리소스 초기화 및 관리
- **`context.rs`**: `GraphicsContext` (Device, Queue, Surface)
- **`pipeline.rs`**: `RenderPipeline` (셰이더, BindGroupLayout)
```rust
let graphics = GraphicsContext::new(window).await?;
let pipeline = RenderPipeline::new_sprite_pipeline(device, format);
```
### `resources/` - GPU 리소스
렌더링에 사용되는 데이터 타입
- **`vertex.rs`**: `Vertex` (위치, 색상, UV 좌표)
- **`texture.rs`**: 텍스처 로딩 함수
```rust
let texture = load_texture_from_file(device, queue, path)?;
```
### `pipeline/` - 렌더링 로직
실제 렌더링 실행 파이프라인
- **`batch.rs`**: `SpriteBatch` (스프라이트 배칭)
- **`commands.rs`**: `RenderCommands` (렌더 패스 실행)
- **`transform.rs`**: `Transform2D` (좌표 변환)
```rust
sprite_batch.begin_frame();
sprite_batch.collect_sprites(entities);
render_commands.execute_render_pass_direct(encoder, view, batch);
```
### `shaders/`
- **`basic.wgsl`**: 2D 스프라이트 기본 셰이더
## 🎯 설계 철학
### 유일 인스턴스 (Singleton-like)
`RenderSystem`은 Engine이 단 하나만 소유하며, GPU 리소스를 독점 관리합니다.
```
Engine
└── RenderSystem (1개)
├── GraphicsContext (Device, Queue, Surface)
├── RenderPipeline (셰이더, 파이프라인)
└── SpriteBatch (배칭 버퍼)
```
### 캡슐화 (Encapsulation)
내부 구현(`GraphicsContext`, `SpriteBatch` 등)은 `pub(super)`로 숨기고, 외부에는 `RenderSystem`만 노출합니다.
**외부 공개:**
- `RenderSystem` - Engine이 사용
- `load_texture_from_file()` - AssetManager가 사용
**내부 전용:**
- `GraphicsContext`, `RenderPipeline`
- `Vertex`, `SpriteBatch`, `RenderCommands`
### 계층적 구조
GPU 추상화 → 리소스 → 파이프라인 → 시스템 순으로 명확히 분리
```
system.rs (조율)
↓
gpu/ (Device, Queue, Pipeline)
↓
resources/ (Vertex, Texture)
↓
pipeline/ (Batch, Commands, Transform)
```
## 📊 렌더링 흐름
### 초기화
```
RenderSystem::initialize(window)
├── GraphicsContext::new() (GPU 초기화)
└── RenderPipeline::new() (셰이더, 파이프라인)
```
### 렌더링 루프
```
RenderSystem::render(&World, &AssetManager)
├── SpriteBatch::begin_frame() (배치 초기화)
├── SpriteBatch::collect_sprites() (Entity → Vertex 변환)
├── GraphicsContext::get_current_frame() (Surface 텍스처)
├── RenderCommands::execute_render_pass_direct()
│ ├── create_vertex_buffer() (정점 버퍼 생성)
│ ├── create_index_buffer() (인덱스 버퍼 생성)
│ └── execute_pass() (렌더 패스 실행)
└── present() (화면 출력)
```
## 🔗 관련 계층
- **`core/`**: `System` trait, `Entity` 제공
- **`runtime/`**: `Engine`이 `RenderSystem` 소유
- **`asset/`**: `AssetManager`가 텍스처 로딩 함수 사용
- **`entity/components/`**: `Sprite`, `Transform` 컴포넌트 제공
## 🚀 사용 예시
### RenderSystem 초기화 (Engine 내부)
```rust
let mut render_system = RenderSystem::new();
render_system.initialize(window).await?;
```
### 렌더링 실행 (게임 루프)
```rust
render_system.render(&world, &mut asset_manager)?;
```
### 텍스처 로딩 (AssetManager)
```rust
use moltrun::render::load_texture_from_file;
let texture = load_texture_from_file(device, queue, "sprite.png")?;
```
### Sprite 컴포넌트 추가 (사용자)
```rust
use moltrun::entity::components::Sprite;
let entity_id = world.create_entity();
if let Some(entity) = world.get_entity_mut(entity_id) {
entity.add_component(Sprite::new([1.0, 0.0, 0.0, 1.0])); // 빨간색
}
```