> For the complete documentation index, see [llms.txt](https://docs.allout.game/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.allout.game/all-out-docs/docs-zh/he-xin-yin-qing-gai-nian/camera-and-post-processing.md).

# 摄像机与后期处理

### 摄像机

每个玩家一开始都会有一个会随着他们移动而跟随的摄像机。要调整缩放或把摄像机移动到其他位置，我们提供了一组 API。

在 CSL 中，摄像机是一个按玩家分配的结构体，位于 `玩家`:

* **`camera.follow_player: 布尔值`**：当 `true`时，引擎会让摄像机持续跟随玩家。
* **`camera.position: v2`**：摄像机在世界空间中的中心（在以下情况下使用 `follow_player = false`).
* **`camera.size: 浮点数`**：缩放量。 **数值越大 = 越缩小** （你能看到更多世界内容）。

玩家组件状态会同步，因此请在玩家的 `ao_late_update` 后面 `is_local_or_server()`:

```go
import "core:ao"

My_Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        if is_local_or_server() {
            // 简单的“设定后就不用管”的缩放
            camera.size = 7.0;
        }
    }
}
```

#### 自定义跟随（偏移 + 平滑）

如果你想要摄像机偏移、过场动画或自定义平滑效果，请关闭 `follow_player` 并自行驱动 `camera.position` ：

```go
import "core:ao"

My_Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        if !is_local_or_server() return;

        camera.follow_player = false;

        // 跟随在玩家上方一点
        target_pos := entity.world_position + v2{0, 0.5};

        // 平滑地向目标移动（对 dt 安全）
        t := clamp(dt * 10.0, 0.0, 1.0);
        camera.position = lerp(camera.position, target_pos, t);

        // 平滑缩放
        target_size := 6.0;
        camera.size = lerp(camera.size, target_size, t);
    }
}
```

渲染器会在 `位置` 和 `尺寸` 之间插值。它们只读的上一帧值可用作 `position_last_frame` 和 `size_last_frame`.

摄像机还提供 `is_visible` 针对点、 `Rect`, `Sprite_Renderer`或 `Spine_Animator`的重载。可选的 `边距` 参数会扩展可见区域。

### 后期处理

后期处理允许你为摄像机应用视觉效果，例如扭曲、颜色分级以及其他效果，让你的游戏更出彩！

你可以通过两种方式配置后期处理：

* **在编辑器中配置**：通过以下路径设置默认的后期处理栈 **Edit → Game Config → Post Processing**。这会在使用默认摄像机行为时生效。
* **通过 CSL 在运行时配置**：使用 `Post_Processing` API 从你玩家的 `ao_late_update` 方法中动态应用效果。

如果你启用任何效果，All Out 将自动使用 HDR 渲染管线。

#### CSL 后期处理 API

每一帧调用以下任意函数以应用后期处理效果。当任意 `Post_Processing` 函数被调用时，它会 **覆盖** 该帧的编辑器默认设置——因此你必须调用所有希望启用的效果。

| 函数                                     | 配置结构体                         | 字段                                                     |
| -------------------------------------- | ----------------------------- | ------------------------------------------------------ |
| `Post_Processing.bloom`                | `Bloom_Config`                | `bloom_amount: 浮点数`                                    |
| `Post_Processing.color_grade`          | `Color_Grade_Config`          | `color_filter: v3`, `saturation: 浮点数`, `contrast: 浮点数` |
| `Post_Processing.chromatic_aberration` | `Chromatic_Aberration_Config` | `channel_offsets: v3`, `focal_point: v2`               |
| `Post_Processing.blur`                 | `Blur_Config`                 | `directions: 浮点数`, `quality: 浮点数`, `size: 浮点数`         |
| `Post_Processing.film_grain`           | `Film_Grain_Config`           | `strength: 浮点数`, `noise_scale: 浮点数`                    |
| `Post_Processing.vignette`             | `Vignette_Config`             | `radius: 浮点数`, `softness: 浮点数`                         |

请把这些调用放在一起，以免多个组件争夺全局场景配置：

```go
import "core:ao"

My_Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        if !is_local_or_server() return;

        // 每一帧应用 bloom + 暗角
        Post_Processing.bloom({bloom_amount = 0.04});
        Post_Processing.vignette({radius = 0.8, softness = 0.4});
    }
}
```

若要恢复编辑器默认值，请停止调用每个 `Post_Processing` 函数。
