01 The project

A real-time atmospheric ocean, rendered from scratch.

Brief → C++ / OpenGL → real-time renderer · co-authored with Claude Code

An open-ocean scene built without a commercial engine: a Gerstner-wave water surface, a physically-motivated iceberg above and below the waterline, an underwater environment, and an interactive camera. The point is the rendering itself, math, shaders, and pipeline, brought together into one self-contained app that runs in real time. The same approach could underpin interactive hero visuals or data-driven brand moments in contexts where a full engine is overkill or unavailable.

Project
Real-time ocean renderer
Open-ocean scene with a physically-motivated iceberg
Context
Graphics craft, hand-built
The rendering foundation under the creative work, no engine
Stack
C++ · OpenGL · GLSL
Self-contained app, dependencies via CMake FetchContent
Walkthrough

The renderer, running.

This is the rendering layer beneath the creative work: shader authorship, pipeline design, and physical plausibility without simulation cost.

02 My role

Sole builder, math to pixels.

I built every layer: the C++ and OpenGL scaffold, the Gerstner-wave ocean surface, the procedural ice material, the underwater post stack, and the interactive camera. Co-authored with Claude Code, with the judgment to know when its output was wrong.

03 The problem

Water, ice, and light are among the hardest things to render.

Real-time rendering of natural phenomena means bridging physically-based theory and performant GPU code. Doing it without a commercial engine means owning the entire stack, the math, the shaders, the architecture, and still landing a convincing image inside a frame budget.

04 What I did

Built a believable scene from shaders up.

Ocean

Gerstner-wave surface

A physically-motivated water surface driven by summed Gerstner waves, not a scrolling noise texture.

Ice

Procedural ice material

The iceberg's look is generated in-shader, holding up both above the waterline and below it.

Underwater

Depth-aware post stack

Color, light, and visibility shift as the camera drops beneath the surface, handled in post.

Pipeline

Multi-pass rendering

Sky, ocean, iceberg, and underwater effects composited through a structured multi-pass pipeline.

05 How it was built

A hand-built pipeline, pass by pass.

No engine doing the hard parts. A self-contained C++ application, dependencies pulled in through CMake FetchContent, with every shader and pipeline stage authored directly. Owning the entire stack means shader issues can be debugged at the source, the renderer can be dropped into non-engine environments, and the dependency surface stays minimal — useful when a platform team needs graphics without bringing an engine along. Co-authored with Claude Code, every output checked against what the frame actually showed.

From build interface to rendered frame
01 · AI
Claude Code
Co-authors the C++ and GLSL by intent, output verified by eye.
02 · Scaffold
C++ / CMake
Self-contained app, dependencies via FetchContent.
03 · Ocean
Gerstner waves
Physically-based water surface, summed wave functions.
04 · Ice
Procedural shader
Iceberg material generated in-shader, above and below water.
05 · Post
Underwater pass
Depth-aware color and light when the camera submerges.
06 · Frame
Multi-pass composite
Sky, ocean, ice, and post composited in real time.

Co-authored with Claude Code, with the judgment to know when the output was wrong: every shader and pipeline decision was checked against the rendered frame, not taken on trust.

Pipeline diagram — Atmospheric Ocean render passes
▸ Pipeline diagramAn atmospheric sky, a Gerstner-wave ocean, a procedural iceberg (composited within the ocean pass), and a depth-aware underwater post — composited into a single real-time frame.
06 The result

A self-contained renderer, no engine underneath.

[ fps ]
Real-time frame rate at target resolution — designed to hold on mid-tier hardware, not just high-end
3
Render passes: sky, ocean, underwater post — iceberg composited within the ocean pass
0
Commercial engine, built on raw C++ and OpenGL
1
Self-contained app, dependencies via CMake FetchContent

Physical plausibility without simulation cost: the look is shaded, not simulated.

The rendering foundation under the creative work, shader authorship and pipeline design owned end to end, with nothing doing the hard parts for me.

Built to show range · graphics craft from math to pixels

Carlos M. Cruz
Creative Technologist · Technical Artist