AgentSkillsCN

ZX Rendering

ZX 渲染技术:相机、模板效果、粒子、字体、2D/3D。触发条件包括“ZX 相机”、“轨道相机”、“模板缓冲区”、“传送门”、“公告牌”、“粒子”、“自定义字体”、“渲染通道”、“2D 与 3D”、“屏幕空间”、“世界空间”。 **在以下情况下加载参考文档:** - 相机实现 -> `references/camera-systems.md` - 模板/传送门效果 -> `references/effects.md` - 2D 与 3D 的抉择 -> `references/2d-vs-3d.md`

SKILL.md
--- frontmatter
name: ZX Rendering
description: |
  ZX rendering techniques: cameras, stencil effects, particles, fonts, 2D/3D. Triggers on "ZX camera", "orbit camera", "stencil buffer", "portal", "billboard", "particles", "custom font", "render pass", "2D vs 3D", "screen space", "world space".

  **Load references when:**
  - Camera implementations -> `references/camera-systems.md`
  - Stencil/portal effects -> `references/effects.md`
  - 2D vs 3D decisions -> `references/2d-vs-3d.md`
version: 1.0.0

ZX Rendering Techniques

Camera Systems

All camera state in static variables for rollback safety.

Camera FFI

FunctionPurpose
camera_set(x,y,z, tx,ty,tz)Position + look-at
camera_fov(degrees)Field of view (default 60)

Follow Camera (Core)

rust
static mut CAM_X: f32 = 0.0;
static mut CAM_Y: f32 = 5.0;
static mut CAM_Z: f32 = 10.0;

fn update_follow_camera(tx: f32, ty: f32, tz: f32) {
    let dt = delta_time();
    let t = (5.0 * dt).min(1.0);
    unsafe {
        CAM_X += (tx - CAM_X) * t;
        CAM_Y += (ty + 5.0 - CAM_Y) * t;
        CAM_Z += (tz + 10.0 - CAM_Z) * t;
    }
}

Render Passes & Stencil

Create portals, scopes, masks using render passes.

FunctionPurpose
begin_pass(clear_depth)New pass
begin_pass_stencil_write(ref, clear)Create mask
begin_pass_stencil_test(ref, clear)Render in mask

Basic Stencil Flow

rust
// 1. Create mask
begin_pass_stencil_write(1, 0);
draw_circle(SCREEN_CX, SCREEN_CY, 200.0);

// 2. Render inside mask
begin_pass_stencil_test(1, 0);
draw_scene();

// 3. Return to normal
begin_pass(0);

Billboard Particles

FunctionModeUse
draw_billboard(w, h, 1, color)SphericalParticles
draw_billboard(w, h, 2, color)CylindricalTrees

Particle System Core

rust
#[derive(Copy, Clone, Default)]
struct Particle { x: f32, y: f32, z: f32, vx: f32, vy: f32, vz: f32, life: f32 }

static mut PARTICLES: [Particle; 256] = [...];

fn render_particles(tex: u32) {
    texture_bind(tex);
    for p in unsafe { PARTICLES.iter() } {
        if p.life > 0.0 {
            push_translate(p.x, p.y, p.z);
            draw_billboard(1.0, 1.0, 1, 0xFFFFFFFF);
            push_identity();
        }
    }
}

Custom Fonts

rust
let tex = rom_texture_str("pixel_font");
let font = load_font(tex, 8, 12, 32, 96);  // 8x12 glyphs

// In render:
font_bind(font);
draw_text_str("SCORE", 10.0, 10.0, 24.0, 0xFFFFFFFF);
font_bind(0);  // Back to default

Coordinate Convention

Y-up, right-handed, -Z forward. When yaw=0, camera looks toward -Z.