尚未偵測到更新。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).