尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
A procedurally generated underwater world rendered with WebGPU. Every run grows a
new reef: terrain, rocks, coral, plants, creatures and fish species are all
generated from a seed, mostly in GPU compute shaders.
Compute shaders are used in two places. At load time they build the world:
textures, terrain and every procedural mesh. Every frame they run the fish
simulation and three lighting effects.查看完整 README ↗A procedurally generated underwater world rendered with WebGPU. Every run grows a new reef: terrain, rocks, coral, plants, creatures and fish species are all generated from a seed, mostly in GPU compute shaders.
Compute shaders are used in two places. At load time they build the world: textures, terrain and every procedural mesh. Every frame they run the fish simulation and three lighting effects.
1. Detail texture: textures.ts
rgba16float storage texture,
with a different pattern in each channel:
MipGenerator), not compute.2. Terrain heightfield: terrain.ts. Two passes run one
after the other through the dispatch2D helper in util.ts.
basinHeight() builds the basin with fbm, a ridged cliff rim,
strata ledges and a gap that drops into the deep. A smooth-min cap keeps the
terrain from ever breaking the water surface.verifyHeightTexture) reads the
height texture back and compares it with the CPU copy. This catches a device
that wrote one but not the other, which would leave props floating in
mid-water.3. Procedural meshes: meshgen.ts
surface() function, which is spliced into
the builder shader. So there is effectively one compute pipeline per kind, and
each one evaluates every vertex of every patch of every variant in a single
dispatch.withLodChain) are the same surfaces run with fewer segments.4. Volumetric terrain: voxel.ts. This is optional,
enabled with ?terrain=voxel. The seabed becomes a 3D density field, which
allows overhangs and tunnels, and is meshed with surface nets entirely on the
GPU. Each 32³ chunk runs three passes:
density_main (4×4×4 workgroups) samples the field: the height map as a
baseline, plus leaning walls and carved tunnels.vertices places one vertex in each cell the surface crosses, using a Newton
step from the cell centre rather than the usual average of edge crossings,
which avoids a quilted look. Output slots are claimed with atomicAdd into
shared vertex and index buffers.quads emits a quad for each grid edge where the field changes sign, again
allocating with atomics.copyBufferToBuffer snapshots the running counters, which
gives that chunk's index range for culling later.top_main pass marches down each column of a 512² grid to find the
top of the rock, then refines it with bisection. It is read back so plants and
the camera stand on the real surface rather than on the height map.reportVertexError reads vertices back as a self-check against the height map.5. Fish simulation: fish.ts
simGroups[flip]).6. GPU culling and LOD: fish.ts (cullWgsl)
atomicAdd,
writing fish indices into a visible list.7. Indirect-args fill: fish.ts (indirectWgsl)
instanceCount fields of the
drawIndexedIndirect args, two draws per bucket (body and fins).8. Caustics: caustics.ts
causticsStride), followed by a mip rebuild.9. Volumetric light shafts: volumetrics.ts
10. SSAO: ssao.ts
rgba8unorm storage texture.Particles and ground cover are stateless: they are recomputed in the vertex shader from hashes and time, with no simulation buffers. Mip generation, bloom, depth of field, TAA and autofocus are all render passes; autofocus renders a small depth patch and reads it back.
any(id >= size) appears in every shader.createComputePipelineAsync is used almost everywhere.
device.ts wraps both pipeline-creation calls and pass
encoding for error reporting and profiling
(profiler.ts times compute passes).