통합 그래픽 파이프라인
단일 WGSL 셰이더 → 4대 GPU
자체 셰이더 컴파일러가 하나의 WGSL 소스를 SPIR-V, Metal MSL, WebGPU, WebGL 2로 픽셀 오차 없이 변환합니다.
네이티브 Vulkan 대비 47–53 dB PSNR 정합성
GANBATE ENGINE · 순수 RUST 3D 코어
외부 런타임 크레이트 없이 직접 구축한 그래픽·물리·월드 스트리밍 스택으로 브라우저 즉시 플레이와 네이티브 앱 성능을 단일 코드베이스에서 실현합니다.
| 백엔드 | 지원 플랫폼 | 셰이더 타깃 (ganbate-shader) | 검증 현황 |
|---|---|---|---|
| Vulkan 1.3 | Linux (X11/XWayland), Windows (Win32), Android 오프스크린 | SPIR-V 직접 생성 |
시스템 로더 직접 바인딩 · 41개 드라이버 검증 통과 |
| Apple Metal | macOS (arm64), iOS / iPhone (arm64 & Simulator) | Metal Shading Language (MSL) |
Objective-C 런타임 직접 바인딩 · WGSL 버퍼 레이아웃 바이트 일치 |
| WebGPU | Chrome / Edge 113+, Safari 26 (macOS, iOS, iPadOS) | 표준 WGSL + 동적 링 오프셋 |
네이티브 Vulkan 대비 47–50 dB PSNR 정합성 |
| WebGL 2 | 모든 모바일·데스크톱 브라우저 범용 폴백 | GLSL ES 3.00 자동 변환 |
std140 블록 & RGBA32UI 텍스처 버퍼 · 49–53 dB PSNR |
인하우스 엔진 · GANBATE ENGINE
처음부터 순수 Rust로 설계해 플레이어는 링크 하나로 수 초 만에 3D 테이블에 입장하고, 스튜디오는 단일 코드베이스로 웹·데스크톱·모바일에 동시 대응합니다.
통합 그래픽 파이프라인
자체 셰이더 컴파일러가 하나의 WGSL 소스를 SPIR-V, Metal MSL, WebGPU, WebGL 2로 픽셀 오차 없이 변환합니다.
네이티브 Vulkan 대비 47–53 dB PSNR 정합성
초고속 웹 스트리밍
69만 삼각형 규모의 베뉴를 삼각형당 약 7바이트(ABEW v4)로 압축해 모바일과 PC에서 다운로드 대기 없이 시작합니다.
120 Hz · 240 Hz ≥98% 프레임 유지율
결정론적 60 HZ 물리
강체, 관절, 연속 충돌 감지가 네이티브 GPU와 브라우저 WASM에서 완전히 동일한 64비트 해시를 보장합니다.
698개 자동화 테스트 · 해시 c9df1e2e6456329b
모던 제작 아키텍처
정규화된 JSON 씬과 CLI 시맨틱 비교, 헤드리스 GPU 검증으로 엔지니어링과 AI 보조 월드 제작 속도를 극대화합니다.
외부 크레이트 0개 · 100% Git diff 가능
외부 런타임 의존성 0개 · 전 기기 60 / 120 / 240 Hz 안정 프레임 유지
외부 크레이트 없이 X11, Win32, Metal, 웹 캔버스를 직접 제어.
정규 JSON 계층 구조를 삼각형당 약 7바이트로 쿠킹해 즉시 웹 스트리밍.
단일 WGSL 소스로 Vulkan, Metal, WebGPU, WebGL 2 동시 구동.
비트 일치 강체 물리, 관절, GPU 스키닝 및 표정 모프.
3D→HUD 앵커 투영, 삼각형 정밀 피킹, 권위 서버 스냅샷 연동.
원자적 JSON 씬 편집, 실행 취소 저널, 픽셀 정합성 및 프레임 검증.
언더 더 후드
간결한 TypeScript/WASM 런타임 API, 4대 타깃 WGSL 셰이더, 무의존성 Rust 물리 엔진과 자동화 CLI.
쿠킹된 3D 베뉴를 브라우저에 로드하고 시간대별 조명과 3D→HUD 정밀 좌표 투영을 제어합니다.
import { createEngine } from '@ganbate/engine-web';
const engine = await createEngine({
canvas,
wasm: '/engine/ganbate_web.wasm',
world: '/worlds/yozakura-v5-live.abew', // 627 entities · 617 lights
look: yozakuraLookV5,
});
engine.fitCanvas();
engine.setView({
eye: [0, 2.15, 3.25],
target: [0, 0.78, 0],
fov: 44,
focus: { distance: 3.4, depth: 4.5, blur: 0.018 },
});
engine.setClock(20.5, performance.now() / 1000);
engine.setWeather('petals');
const tableSpot = engine.createLight({
kind: 'spot',
position: [0, 2.6, 0.2],
direction: [0, -1, -0.08],
color: [1.0, 0.84, 0.62],
intensity: 16.0,
shadow: 0.85,
});
engine.render();
const hudAnchor = engine.project([0, 0.92, 0]);
const hitProp = engine.pick(pointerX, pointerY);
하나의 WGSL 코드만으로 Vulkan SPIR-V, Apple Metal, WebGPU, WebGL 2 셰이더를 자동 생성합니다.
// Compiled across Vulkan, Metal, WebGPU & WebGL 2 by ganbate-shader
fn shade(in: ShadeInput) -> vec4f {
let peel_line = in.params[0].x; // Live frame parameter (no pipeline rebuild)
let curl_radius = in.params[0].y;
let reveal = smoothstep(peel_line - 0.02, peel_line + 0.02, in.uv.y);
// Sample card back & face textures with mip-bias control
let card_back = textureSampleBias(base_tex, material_sampler, in.uv, -0.25);
let mirrored_uv = vec2f(1.0 - in.uv.x, in.uv.y);
let card_face = textureSampleBias(emissive_tex, material_sampler, mirrored_uv, -0.25);
// Subtle crease shadow along the live squeeze fold
let crease = 1.0 - 0.32 * exp(-pow((in.uv.y - peel_line) / curl_radius, 2.0));
let rgb = mix(card_back.rgb, card_face.rgb, reveal) * crease;
return vec4f(rgb * in.tint.rgb, card_back.a * in.tint.a);
}
외부 크레이트 없는 순수 Rust 강체 시뮬레이션으로 네이티브와 WASM에서 동일한 64비트 상태 해시를 보장합니다.
use ganbate_physics::{BodyDesc, BodyKind, ColliderDesc, PhysicsWorld, Shape, Vec3};
let mut world = PhysicsWorld::new(Vec3::new(0.0, -9.81, 0.0));
let felt = world.add_body(BodyDesc::new(BodyKind::Static, Vec3::ZERO));
world.add_collider(
felt,
ColliderDesc::new(Shape::Box(Vec3::new(1.35, 0.05, 0.75)))
.friction(0.62)
.restitution(0.18),
);
let chip = world.add_body(
BodyDesc::new(BodyKind::Dynamic, Vec3::new(-0.42, 0.38, 0.12))
.linear_velocity(Vec3::new(1.85, -0.40, 0.0))
.ccd(true),
);
world.add_collider(chip, ColliderDesc::new(Shape::Cylinder { half_y: 0.0017, radius: 0.02 }));
for _ in 0..120 {
world.step(1.0 / 60.0); // Identical 64-bit state hash on native & wasm32
}
assert_eq!(world.state_hash(), 0xc9df_1e2e_6456_329b);
스크립트나 AI 도구에서 스키마 검증된 JSON 트랜잭션을 적용하고, 시맨틱 Git 비교와 헤드리스 렌더로 즉시 검증합니다.
# 1. Apply an atomic, schema-validated scene transaction
ganbate-engine scene apply ./yozakura scenes/harbor.scene.json - <<'EOF'
{
"label": "Warm harbor lanterns & add terrace hero camera",
"edits": [
{ "op": "set", "entity": "Bridge/Lantern 04", "path": "light.intensity", "value": 18.5 },
{ "op": "create", "name": "Terrace Hero Cam", "components": {
"camera": { "fov": 42 },
"transform": { "translation": [-4.2, 2.6, 8.4], "rotation": [0, 0.38, 0, 0.92] }
}}
]
}
EOF
# → {"ok":true,"written":true,"edits":2,"issues":[],"hash":"2c983daa91f04e1b"}
# 2. Semantic diff vs. Git HEAD & headless GPU verification frame
git show HEAD:scenes/harbor.scene.json | ganbate-engine scene diff - scenes/harbor.scene.json
ganbate-engine render ./yozakura scenes/harbor.scene.json --camera "Terrace Hero Cam" --out verify.png
3D 월드를 5배 작은 ABEW v4로 압축하고 120/240 Hz 프레임 유지율 검증과 전용 Studio 도구를 연결합니다.
# Cook scene into compact ABEW v4 package (~1/5 download size, preserves all 627 entities)
ganbate-build import ./yozakura content/models/harbor.glb content/scenes/harbor.scene.json
ganbate-build cook-scene --compact --keep-images ./yozakura content/scenes/harbor.scene.json dist/harbor.abew
# Verify 120 Hz mobile & 240 Hz desktop ≥98% presentation cadence
ganbate-framecheck 120 1200 mobile-120hz-trace.txt
ganbate-framecheck 240 600 desktop-240hz-trace.txt
# editor/project-tools.json — mounts game authoring tools inside Ganbate Studio
{
"version": 1,
"origin": "https://play.ganbate.io",
"tools": [
{ "label": "Action Flow Sequencer", "path": "/dev/sequencer" },
{ "label": "Audio Cue Mixer (128 cues)", "path": "/dev/audio" },
{ "label": "Character Expression Studio", "path": "/dev/expressions" }
]
}
지금 플레이 가능
데스크톱과 모바일 브라우저에서 설치 없이 바로 즐기는 소셜 포커, 블랙잭, 바카라.
만 18세 이상 · 게임 내 가상 칩 전용 (현금 환전·경품 교환 불가)