{"id":"moon-pearl","version":"1.0.0","title":"The Moon Is a Pearl","summary":"A moon over a midnight sea; the camera withdraws to show the sea sits inside a giant oyster and the moon is its pearl. Iridescent nacre, ray-traced reflections. Loops.","kind":"background","target":"three","collections":["impossible-worlds","hypnotic-loops"],"tags":["moon","pearl","oyster","nacre","iridescent","sea","night","surreal","reveal","mother of pearl","ocean","reflection","loop","portrait film"],"loopable":true,"motion":"procedural","durationSeconds":12,"status":"published","media":{"poster":"https://aipixelwizard.com/media/moon-pearl/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/moon-pearl/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/moon-pearl/1.0.0/sample.mp4","sampleBytes":1967025,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/moon-pearl","manifest":"https://aipixelwizard.com/api/v1/visuals/moon-pearl/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/moon-pearl/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/moon-pearl/1.0.0/","demo":"https://aipixelwizard.com/registry/moon-pearl/1.0.0/index.html"},"description":"A full moon hangs over a dark sea, with its rippling reflection below. The camera withdraws and light unfurls across mother-of-pearl: the sea is held inside a monumental oyster, hinged and opened to about 76 degrees, and the moon is the pearl resting in it, reflected in the black water. The layered shell halves, the iridescent nacre with its growth rings, the contact shadows and the ray-traced pearl reflection are all computed in the shader, and every animated part completes whole cycles, so the 12 seconds loop exactly. The film has no settings.","role":"Shader film (three.js): Surreal nacre sculpture, a finished 12-second portrait film with no settings.","useCases":["A jewellery, perfume or luxury-brand teaser","A dreamy title backdrop for a story or a meditation","A \"zoom out\" reveal for a surprising twist"],"synonyms":["moon and pearl","oyster reveal","giant oyster","pearl animation","moon over the sea","zoom out reveal"],"digest":"33f4ebf6db0f59d07250b25e916ba967e5671643905f1e909c30278d5efe0864","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/moon-pearl.js","exports":[{"name":"createMoonPearl","signature":"createMoonPearl() => { scene, camera, setSize(width, height), update(time), dispose() }","description":"The film as one full-screen shader; render its scene with its camera straight to the canvas."}],"reusable":["src/moon-pearl.js"],"demo":"demo.js","harness":"index.html"},"dependencies":[{"id":"three","version":"0.185.1","scope":"source","reason":"Renderer and a full-screen shader material."},{"id":"apw-runtime","version":"1.0.0","scope":"demo","reason":"Demo harness."}],"uses":[],"usedBy":[],"params":[],"presets":[],"output":{"width":1080,"height":1350,"fps":30,"durationSeconds":12,"posterSeconds":7.8,"alpha":false,"motion":"procedural","loop":{"seamless":true,"cycleSeconds":12,"method":"Every part of the film is a function of the time modulo its length, and every motion completes whole cycles, so the last frame meets the first."},"seed":null},"composition":{"inputs":"The time in seconds, 0 to 12. The film has no other settings.","outputs":"An opaque full-frame picture, already in display colours: render it straight to the canvas.","coordinates":"Composed for a 4:5 portrait frame and measured by the frame height: in a wider frame the picture stays centred at full height and its background fills the sides; in a narrower one, such as 9:16, the sides are cropped.","lighting":"Moonlit: a bright pearl reflected in rippling water, iridescent nacre and contact shadows.","timing":"Moon and sea first; the camera withdraws and light unfurls across the shell to show the oyster; the view then returns to the moon.","compatibleWith":[],"notes":["The rear shell half is genuinely opened about 76 degrees on a shared hinge.","It is one of the heavier films: about 30 ms a frame on an integrated GPU.","Every pixel is a function of the time alone, so frames can be rendered in any order."]},"reuse":["Reveal clip: the pull-back from moon to oyster is a ready-made \"it was something else\" moment.","Seamless loop: it returns to the moon at the end, so it repeats for any length.","Calm night background: hold the first seconds as a still moon over the sea."],"integration":{"newProject":"Create a WebGLRenderer on a canvas (no antialiasing), call createMoonPearl() once and film.setSize(width, height); then for each frame call film.update(timeInSeconds) and renderer.render(film.scene, film.camera).","existingProject":"Copy src/moon-pearl.js, which needs only three. Render film.scene with film.camera into your own canvas or render target; the output is opaque and already in display colours, so use no tone mapping or colour conversion."},"performance":{"notes":"One full-screen fragment shader. About 32 ms a frame at 1080 by 1350 on an integrated Intel GPU (Iris Xe), and about 8 s a frame with software WebGL.","limits":"Plays at 30 frames a second at full size on an integrated GPU."},"limitations":["The film is finished: it has no settings. To change colours or timing, edit the shader.","It is composed for a 4:5 portrait frame.","Its length is fixed at 12 seconds; repeat the loop to fill a longer clip."],"license":{"spdx":"MIT","notice":"Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.","thirdParty":[]},"rights":{"approvedForPublicRelease":true},"provenance":"From the owner's collection Twenty Impossible Worlds: the original GLSL ES 3.00 shader of the film “The Moon Is a Pearl”, created with ChatGPT / Codex and used as published, wrapped for AI Pixel Wizard as a three.js full-screen shader in October 2026. The collection's synthesised soundtrack is not part of this ingredient.","changelog":[{"version":"1.0.0","date":"2026-10-10","notes":"Initial release."}],"verification":{"testedOn":"2026-10-10","inputs":{"moon-pearl@1.0.0":"33f4ebf6db0f59d07250b25e916ba967e5671643905f1e909c30278d5efe0864","three@0.185.1":"664ca387e5fab46ff2daaa6895e1d015426850891af5ea5082cbbcc3985b068c","apw-runtime@1.0.0":"5be859cdac74823ba0bcc32c6daf06688a871104d24db5d4ceaffffd84d7c40d"},"environment":"Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0","renderer":"WebGL 2 via SwiftShader (software)","width":1080,"height":1350,"fps":30,"frames":360,"renderSeconds":5763,"loopCheck":{"checked":true,"seamless":true,"maxDifference":0,"note":"Frame 0 vs end state (progress 1): mean |Δ| 0.0000, max |Δ| 0 of 255."},"determinism":{"checked":true,"identical":true},"errors":[],"media":{"poster":"/media/moon-pearl/1.0.0/poster.webp","preview":"/media/moon-pearl/1.0.0/preview.mp4","sample":"/media/moon-pearl/1.0.0/sample.mp4","sampleBytes":1967025}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/moon-pearl/1.0.0/LICENSE"},{"path":"asset.json","size":5971,"sha256":"2dd2ecfebf1cee45afee23fe93287be99fe7361fb1cc100ef1997595a8ce92b1","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/moon-pearl/1.0.0/asset.json"},{"path":"demo.js","size":663,"sha256":"3c5723faa08cb2a949436de16f31659576d028532184153185f7fd4ee1c6dd2d","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/moon-pearl/1.0.0/demo.js"},{"path":"index.html","size":533,"sha256":"89299ea5e6d34ba87310a17219c134f8edd84feff5e21b094eb5c1aa9717659f","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/moon-pearl/1.0.0/index.html"},{"path":"src/moon-pearl.js","size":13145,"sha256":"f5d5c2b5ec4af3403d25c0657ec6d5e55082c48b58878a979bdfbcf10580e3e2","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/moon-pearl/1.0.0/src/moon-pearl.js"}],"warnings":[]}